1.为Js原始值创建临时对象,并进行属性引用
var s="text"; s.len=4;//这里Js调用new String(s)的方法创建了一个临时对象,用来属性引用 console.log("s.len属性的值为:"+s.len);//属性引用结束后销毁临时对象,因此s.len的值为undefined
运行结果为:
s.len属性的值为:undefined
2.Js原始值的属性不可以修改,而对象的属性可以修改
var o={x:1}; o.x=2;//修改对象属性 o.y=3;//增加一个属性 console.log('o.x的值为'+o.x+'; o.y的值为:'+o.y); var a=[1,2,3,4];//数组也是一类对象 a[4]=5;//给数组增加一个新元素 console.log('数组a的第五个元素为:'+a[4]);
运行结果为:
o.x的值为2; o.y的值为:3
数组a的第五个元素为:5
3.原始值与包装对象的区别
var s="test",n=1,b=true; var S=new String(s); var N=new String(n); var B=new String(b);//使用构造函数显式创建包装对象 console.log('s==S的值为'+(s==S)); console.log('s===S的值为'+(s===S));//在'==='条件下,原始值与其包装对象不相等 console.log('因为s的类型为'+typeof(s)+'; 而S的类型为:'+typeof(S));//使用typeof()测试对象属性
运行结果为:
s==S的值为true
s===S的值为false
因为s的类型为string; 而S的类型为:object
4.对象的比较是引用比较,引用仅引用实际对象的地址,未创建新对象
var o={x:1},p={x:1}; console.log('o与p相等:'+(o===p));//并未引用同一个对象
运行结果为:
o与p相等:false
5.引用同一个对象进行比较
var a=[],b=a; b[0]=1; console.log('a[0]的值为'+a[0]); console.log('a与b相等:'+(a===b));
运行结果为:
a[0]的值为1
a与b相等:true
6.复制对象,必须复制该对象的每一个元素,不能采用引用的方式
var c=['a','b','c']; var d=[]; for(var i=0;i<c.length;i++){ d[i]=c[i]; } console.log('d的值为:'+d);
运行结果为:
d的值为:a,b,c
7.未赋初始值的变量声明,变量值为undefined
var m; console.log('m的值为:'+m);
运行结果为:
m的值为:undefined
8.JavaScript的变量可以是任何类型
var n=3; console.log('n的类型为'+typeof(n)); n='matter'; console.log('重新赋值后,n的类型为'+typeof(n));
运行结果为:
n的类型为number
重新赋值后,n的类型为string
9.全局变量具有全局作用域,函数体内声明的变量只拥有函数体内作用域;全局变量可能被同名的局部变量覆盖,见下例:
var scope='global'; function checkscope(){ console.log('scope的值为'+scope);//这里的值为undefined,原因是函数体内的scope变量覆盖了全局变量,但是只有当执行到局部var语句的时候scope才会被赋值 var scope='local';//重新初始化scope console.log('scope的值为'+scope); } checkscope();
运行结果为:
scope的值为undefined
scope的值为local
10.嵌套函数中的变量作用域
var scope='global'; function checkscope02(){ var scope='local'; function nested(){ var scope='nested scope';//最里层修改scope的值,作用在整个checkscope02()函数当中,而不仅仅是nested()函数 console.log('scope的值为'+scope); } return nested();//返回函数即执行该函数 } checkscope02();
运行结果为:
scope的值为nested scope
11.JavaScript没有块级作用域:花括号外,函数体内的变量都会作用于整个函数
function test(g){ var i=0 if(g=='object'){ var j=0; for(var k=0;k<3;k++){ console.log('在for循环体内,第'+k+'次打印k的结果为:'+k); } console.log('在for循环体外,第'+k+'次打印k的结果为:'+k); } console.log('在if循环体外,j的值为:'+j); } test('object');
运行结果为:
在for循环体内,第0次打印k的结果为:0
在for循环体内,第1次打印k的结果为:1
在for循环体内,第2次打印k的结果为:2
在for循环体外,第3次打印k的结果为:3
在if循环体外,j的值为:0
JavaScript解析变量时,会在作用域链中查找,该链为对象列表。如果第一个对象不存在名为x的属性,会继续查找链中的第二个对象。如果都找不到会抛出ReferenceError异常。
【JavaScript语言字典 路冉编辑20150205Ver1.0.0】