javascript进阶(一)— — js暗点

来源:互联网 发布:ios程序员工资待遇知乎 编辑:程序博客网 时间:2024/04/29 19:57

1、包装对象

var a = "string";alert(a.length);//6a.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 definedconsole.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
0 0
原创粉丝点击