1、包装对象
var a = "string";
alert(a.length);//6
a.t = 3;
alert(a.t); //undefined
javascript让”string”基本类型会转换成 String(Object)【new String(“string”);】包装类型临时对象,所以可以a.length获取长度,a.t设置之后该临时对象会销毁掉,所以获取不到a.t的值
2、{ }正确使用
{a: 1, b: 2}; //Uncaught SyntaxError: Unexpected token :
{ 花括号开头被理解成块
var obj = {a: 1, b: 2};
正确理解为对象自变量表达式
3、var a = b = 1
的理解
function foo() {
var a = b = 1;//相当于var a, (b=1);即b成了隐式全局变量
}
foo(); //调用后b全局可见
console.log(a);//Uncaught ReferenceError: a is not defined
console.log(b);//1
4、for in
缺点:
- 顺序不确定
- enumerable为false时不会出现
- for in对象属性受原型链的影响
5、变量提升
变量在一个范围内声明的时候,javascript引擎会将这个声明移到范围顶部。
var v='Hello World';
(function(){
console.log(v);
var v='I love you';
})();//undefined
这段代码等价于
var v='Hello World';
(function(){
var v;
console.log(v);
v='I love you';
})();
再来一个例子
var foo = 1;
function bar() {
if (!foo) {
var foo = 10;
}
console.log(foo);
}
bar();//输出为10,原因看下面等同代码
//等同于于一下代码
var foo;
foo = 1;
function bar(){
var foo;//undefined
if(!foo){ //!foo为真,执行下面foo = 10
foo = 10;
}
console.log(foo);
}
bar();
另外一个例子:
var a = 1;
function b() {
a = 10;
return;
function a() {}
}
b();
console.log(a); //1
//等同于以下代码,原因分析如下, 声明式函数会提升置顶
var a;
a = 1;
function b(){
function a(){}; //声明式函数会提升置顶
a = 10;
return;
}
b();
console.log(a);
//这里函数b的外部定义了a,值为1.函数b内,声明函数a的过程被提升(hoist),之后a被赋值为10;由于是函数b中新定义了a,所以对函数b外部的a并不造成影响,最后得console.log(a)输出的值还是1;
同样,匿名函数也受命名提升的影响
(function(){
foo();
function foo(){
console.log("我来自 foo");
}
})(); //我来自 foo
(function(){
foo();
var foo = function(){
console.log("我来自 foo");
}
})();//TypeError: foo is not a function