18910140161

Javascript学习笔记一

顺晟科技

2021-06-16 10:58:13

302

一、数据类型

基元值是存储在堆栈中的简单数据段,即它们的值直接存储在变量的访问位置。(ECMAScript有五种原始类型:Undefined、Null、Boolean、Number和String。)

引用值是存储在堆中的对象,这意味着存储的值是指向存储对象的内存的点。(对象,数组函数是引用类型)

1)数字

2)字符串

数字转换字符串:

var i=138//三种方法var S1=I“”;var S2=String(I);var S3=I . ToString();console . log(type of(I));//number console . log(type of(S1));//stringconsole . log(type of(S2));//stringconsole . log(type of(S3));//string//二进制、八进制和十六进制var S4=I . tostring(2);var S5=I . ToString(8);var S6=I . ToString(16);console . log(S4);//10001010 console . log(S5);//212 con sole . log(S6);//8a

字符串转换号:

var s='22岁';var I=s-0;//注意:字符串加0会导致字符串连接var j=Number(I);var k=ParSeint(s);var l=ParseFloat(s);console . log(type of(s));//string console . log(type of(I));//number console . log(type of(j));//编号

ParseInt和parseFloat可以从字符串的开头转换并返回任何数字,忽略或丢弃非数字部分。ParseInt只截取整数,而parseFloat截取整数和浮点数。如果ParseInt以0x或0X开头,它会将其解释为十六进制数。

字符串链接编号:

var longString='这是故事,一个叫bingdian的人写的'

3)布尔值

4)null

Null是一个特殊值,在下列情况下应该使用null:

用于初始化一个变量,该变量可以被指定为一个对象

用于与已初始化的变量进行比较,该变量可以是也可以不是对象

当函数的参数预期为对象时,它作为参数传入

当函数的返回值预期为对象时,它用作传出的返回值

以下情况不应使用null:

不要使用null来检测参数是否被传入

不要使用null来检测未初始化的变量

示例代码:

//好用法var person=null//好用法函数getperson(){ if(condition){ return new person(' bindian ');} else { return null} }//好用法var person=getPersonif (person!===null){ DosMesing();}//不好的用法,用来比较var person和未初始化的变量;if (person!=null){ DosMesing();}//不好的用法,检查参数函数是否做了什么(arg1,arg2,arg3,arg4) {if (arg4!=null){ dosamesingelse();}}

理解null的更好方法是将其视为对象的占位符。

5)undefined

Undefined是一个特殊的值,很容易和null混淆。undefined==null为真,这两个值有不同的用途。

所有未初始化的变量都有一个初始值,即未定义,这意味着变量正在等待被赋值。

//写var人不好;console . log(person===undefined);//true

虽然此代码工作正常,但建议避免在代码中使用undefined。该值经常与返回“undefined”的运算符类型混淆。Typeof不管理未定义的变量或未声明的变量,操作结果为“未定义”:

//foo没有声明var personconsole.log(人员类型);//' undefined ' console . log(foo类型);//“未定义”

通过禁止使用未定义的特殊值,可以确保typeof只在一种情况下返回' undefined':

6)函数

7)对象

8)数组

9)Date对象

10)正则表达式

11)Error对象

二、变量

1)变量声明

变量用关键字var声明,例如:

var i,num,a,b,name=' bingdian

var关键字声明的变量是性的,用delete运算符删除这些变量会导致错误。

x=1;删除x;console . log(x);//x未定义

javascript的变量类型是松散类型的,可以用来保存任何数据类型。您可以在修改变量值的同时修改变量类型:

var答案=10;x='答案是' 10y=10 '是答案' console . log(x);//答案是10 console . log(y);//10是answer var a=' 17 '-8;//9 var b=' 17 ' 8;//178 console . log(a);console . log(b);

使用未声明的变量将引发错误。

2)变量作用域 ###

变量的作用域是程序中定义变量的区域。函数中声明的变量只在函数内部起作用(局部变量必须用var关键字声明)。

在函数内,局部变量的作用域优先级高于同名的全局变量,例如:

var i=99var foo=function(){ var I=10;console . log(I);} foo();//10使用本地变量console . log(I);//99使用全局变量

声明局部变量时,必须使用var关键字。当您使用var关键字声明变量时,变量将自动添加到最近的可用环境中。如果不写var,变量会暴露在全局上下文中,这可能与现有变量冲突。另外,如果不添加,很难知道变量的作用域是什么,变量很容易像局部作用域一样泄漏到Document或Window中,所以需要用var声明变量。示例:

var a=3;var foo=function(){ a=10;b=22console . log(a);console . log(b);} foo();//10 22 con sole . log(a);//10 console . log(b);//22

如果一个变量在没有声明的情况下被初始化,它将被自动添加到全局环境中。请看下面两个例子:

函数add(a,b){ var sum=a b;返回总和;}var rs=add(2,3);console . log(RS);//5 console . log(sum);//sum未定义函数add(a,b){ sum=a b;返回总和;}var rs=add(2,3);console . log(RS);//5 console . log(sum);//5 sum初始化赋值时没有使用var关键字。调用add()后,加到全局变量的sum继续存在。

javascript执行代码时,创建了一个上下文执行环境,全局环境是最外层的环境。每个函数在被调用时都创建自己的执行环境,当函数被执行时,当前的执行gg'f环境被破坏。每个执行环境都有一个与之关联的范围链。当执行代码时,javascript引擎通过搜索执行环境的范围链来解析标识符,如变量和函数名。解析过程从作用域链的前端开始,逐步向上查询与给定名称匹配的标识符。一旦找到标识符,搜索过程就停止。如果没有找到,它将继续沿着作用域链向上搜索,直到找到全局对象。如果未找到,则认为标识符未定义。标识符在作用域链中的位置越深,查找和访问它的时间就越长,所以要尽可能多地使用局部变量。

全局环境只能访问全局环境中定义的变量和函数,不能直接访问本地环境中的任何数据。

3)没有块级作用域 ###

var a=8;var foo=function(){ console . log(a);//未定义var a=5;console . log(a);//5 } f();

因为局部变量是在整个函数foo()中定义的,全局变量隐藏在整个函数中。虽然局部变量是在整个函数体中定义的,但是在var语句之后并没有初始化。所以更好在函数顶部声明函数中用到的所有变量。

4)未定义的变量和未赋值的变量 ###

未赋值的变量值是未定义的,使用未定义的变量会导致错误。

var a;console . log(a);//undefinedconsole . log(b);//b未定义

5)垃圾收集(grabage collection)

Javascript有一个自动垃圾收集机制,JavaScript解释器可以检测程序何时不再使用某个对象,并释放其占用的内存。

三、运算符

1)算术运算符

加法运算符()

减法运算符(-)

乘法运算符(*)

除法运算符(/)

模运算符(%),模运算符通常是整数,但也适用于浮点数。

加法运算符()

增量运算符()

I=1;j=I;console . log(I);//2console . log(j);//2i=1;j=I;console . log(I);//2console . log(j);//1

递减运算符()

I=1;j=-I;console . log(I);//0 console . log(j);//0i=1;j=I-;console . log(I);//0 console . log(j);//1

2)相等运算符

==等号运算符允许类型转换来检测两个运算符是否相等。

如果这两个值具有相同的类型,请检查它们的相等性,如果这两个值相同,则它们相等。

如果这两个值属于不同的类型:

如果一个为空,另一个未定义,则它们相等

如果一个是数字,另一个是字符串,则将字符串转换为数字比较

如果一个为真,将其转换为1比较。如果一个为假,将其转换为0进行比较。

如果一个值是对象,另一个值是数字或字符串,请将对象转换为原始类型值,然后进行比较。您可以使用toString或valueOf转换对象。

JavaScript是弱类型语言,这意味着等式运算符将执行强制类型转换,以便比较两个值。

“==' 0 '//false 0==' '//true 0==' 0 '//true false==' false '//false false==' 0 '//true false==undefined//false==null//false null==undefined//true/t/r/n '==0//true

以上说明了强类型转换,这也是使用==被广泛认为是不好的编程习惯的主要原因。由于其转换规则复杂,会导致难以跟踪的问题。

此外,强制类型转换也会导致性能消耗。例如,为了将一个字符串与一个数组进行比较,必须事先将其强制转换为数字。

3)===完全等同

当两种值类型不同时,它们也是不同的

如果两个值都是数字,除非其中一个或两个都是NaN,否则它们是等价的。

如果两个值都是字符串,并且相同位置的字符相同,则它们是相同的。

如果两个布尔值都为真或都为假,则它们相等。

两个值指的是同一个对象、数组或函数,它们是相同的。如果引用了不同的对象,它们就不相等。

如果两个赋值器都为空或者都是未定义的,那么它们是相同的。

{}==={};//false new String(' foo ')==' foo ';//false new Number(10)===10;//false var foo={ };foo===foo//true

这里等于运算符的不是值是否相等,而是它们是否属于相同的标识,也就是说,只有对象的相同实例才被认为是相等的。

4)关系运算符

、=、=

比较运算符只能在数字和字符串上执行,不是数字或字符串的操作数将被转换为数字或字符串。

5)in运算符

在中,左操作数是字符串或可以转换为字符串,右操作数是对象或数组。如果左边的值是右边对象的属性名,则返回true。

6)typeof运算符

运算符的类型(以及instanceof)可能是JavaScript中更大的设计缺陷,因为几乎不可能从它们那里得到想要的结果

值类型类类型-“foo”字符串新字符串(“foo”)字符串对象1.2数字新数字(1.2)数字对象真布尔布尔布尔布尔新布尔(真)对象新日期()日期对象新错误()数组对象新数组(1,2,3)数组对象新函数(“”)函数/abc/g RegExp对象(Nitrol/V8中的函数)新RegExp对象(Nitrol/V8中的函数){}对象新对象()对象对象对象

在上面的代码中,“类型”列表示操作符类型的操作结果。如您所见,在大多数情况下,该值返回“object”。

类别列表示对象的内部属性[[类别]]的值。

JavaScript标准文档中定义的: [[Class]]的值只能是以下字符串之一:自变量、数组、布尔值、日期、错误、函数、JSON、数学、数字、对象、regexp、字符串。

为了获得对象的[[类]],我们需要使用在Object.prototype上定义的方法toString

console . log(object . prototype . tostring . call([]));//'[object Array]' console . log(object . prototype . tostring . call({ });//'[Object Object]' console . log(Object . prototype . tostring . call(2));//'[对象编号]'

为了检测对象的类型,强烈建议使用Object.prototype.toString方法;因为这是的依靠。如上表所示,标准文档中没有定义typeof的一些返回值,所以不同的引擎实现可能会有所不同。

除非为了检测一个变量是否已经被定义,否则我们应该尽量避免使用typeof运算符。

7)instanceof运算符

instanceof的左操作数是对象,右操作数是对象类的名称。如果左对象是右类的实例,则返回true。

比较自定义对象:

function Foo(){ } function Bar(){ } Bar . prototype=new Foo();新条形图()实例条形图;//true new Bar()instance of Foo;//true//如果只将Bar.prototype设置为函数Foo本身,而不是Foo构造函数Bar.prototype=Foo的一个实例;Foo的new Bar()实例;//false

比较内置类型的实例:

字符串的新字符串(' foo ')实例;//对象的truenew String('foo ')实例;String的true 'foo ' instanceof//false对象的“foo”实例;//false

instanceof运算符只能用于比较来自同一JavaScript上下文的自定义对象。

8)字符串运算符

9)逻辑运算符

、 || 、

10)条件运算符

11)其它运算符

对象创建操作符新建

删除运算符

数组对象访问运算符[],

四、语句

1)if

2)else if

3)switch

switch(n){ case 1://do this break;case 2://做点什么打破;case ://做点什么打破;case 4://做点什么打破;default ://做某事休息;}

4)while

var count=0;while(count 10){ console . log(count);}

5)do while

var count=0;do { console . log(count);} while(数到10)

6)for

for(var I=0;i 10I){ console . log(I);}

7)for in

Object .原形. bar=1;var person={ ' name ' : ' bingdian ',' age ' : ' 25 ' } for(I person){ console . log(I ' : ' person[I]);}//name : bindian//age :25//bar :1

像in操作符一样,for in循环在寻找对象的属性时也遍历原型链上的所有属性。

因为不可能改变for本身的行为,所以需要过滤掉不想出现在循环体中的属性,这可以通过Object.prototype的原型上的hasOwnProperty函数来完成

Object .原形. bar=1;var person={ ' name ' : ' bingdian ',' age ' : ' 25 ' } for(I person){ if(person . HasownProperty(I)){ console . log(I ' : ' person[I]);} }//name : bindian//age :25

始终建议使用HasOwnProperty。不要对代码运行的环境做任何假设,也不要假设本机对象是否已经扩展。

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航