zoukankan      html  css  js  c++  java
  • JS类型(2)_JS学习笔记(2016.10.02)

    undefined

    undefined是全局对象(window)的一个特殊属性,其值是未定义的。但 typeof undefined 返回 'undefined' 。

    虽然undefined是有特殊含义的,但它确实是一个属性,而且是全局对象(window)的属性。当我们在程序中使用undefined值时,实际上使用的是window对象的undefined属性。

    注意:

    ·undefined参与任何数值计算时,其结果一定是NaN。

    ·只能用 === 运算来测试某个值是否是未定义的,因为 == 运算符认为 undefined 值等价于 null。[ 注释:null 表示无值,而 undefined 表示一个未声明的变量,或已声明但没有赋值的变量,或一个并不存在的对象属性。]

    ·当我们将一个变量或值与undefined比较时,实际上是与window对象的undefined属性比较。这个比较过程中,JavaScript会搜索window对象名叫 'undefined' 的属性,然后再比较两个操作数的引用指针是否相同。由于window对象的属性值是非常多的,在每一次与undefined的比较中,搜索window对象的undefined属性都会花费时 间。在需要频繁与undefined进行比较的函数中,这可能会是一个性能问题点。因此,在这种情况下,我们可

    以自行定义一个局部的undefined变 量,来加快对undefined的比较速度。例如:

    function anyFunc()

    {

    var undefined;         //自定义局部undefined变量

    if(x == undefined)      //作用域上的引用比较

          while(y != undefined)   //作用域上的引用比较

    };

    其中,定义undefined局部变量时,其初始值会是对window.undefined属性值的引用。新定义的局部undefined变量存在与该函数的作用域上。在随后的比较操作中,JavaScript代码的书写方式没有任何的改变,但比较速度却很快。因为作用域上的变量数量会远远少 于window对象的属性,搜索变量的速度会极大提高。

    这就是许多前端JS框架为什么常常要自己定义一个局部undefined变量的原因!

    null

    null在 Javascript中代表一个特殊的Object类型的值,他用来表示空引用的概念,如果要将一个标识符声明称object类型,但是暂时不给他实例,那么就可以将它先初始化为null,以便以后使用。

    注意:

    ·null == undefined ,但是null !== undefined

    ·null 参与数值运算时其值会自动转换为 0

    NaN

    NaN是一种特殊的number。

    NaN与任何值都不相等,与自己也不相等。

    对象

    1、对象中包含着一系列属性,并且这些属性是无序的,每个属性都包含着一个字符串key和对应的值value。

    var obj = {};

    obj[1] = 1;   //数字1会被自动转换成字符串’1’

    obj[‘1’] = 2;

    obj;   // Object {1 : 2}

    obj[{}] = true;

    obj[{x : 1}] = true;

    obj;   //Object {1 : 2;[object Object] : true}

    2、对对象的新增、删除属性操作,只会在对象本身上进行操作,不会修改到对象的原型上的属性。

    var obj = {x : 1}

    obj.prototupe.y = 3;

    obj.y = 2;

    obj;   //object {x : 1;y : 2}

    obj.prototupe.y;   //3

    delect obj.y

    obj;   //object {x : 1}

    obj.prototupe.y;   //3

    obj.y;   //3

    3、遍历对象的属性时,可以有两种方法:

    (1)for循环

    var obj = {x1 : 1;x2 : 2}

    for(var I = 0;i<2;i++){

         console.log(obj[‘x’+i]);

    }

    (2)for…in遍历

    var obj = {x1 : 1;x2 : 2}

    var p;

    for(p in obj){

         console.log(obj[p]);

    }

    注意:使用for…in遍历对象时,获取到的属性是无序的,并且会把对象原型链上的属性也遍历出来。

    例如:

    Object.prototype.bar = 10;      // 修改Object.prototype 

    var obj={"name":"wjy","age":26,"sex":"female"};    //定义一个object对象    

    var keys=[];      //定义一个数组用来接受key,此时的key即为对象的属性名    

    var values=[];     //定义一个数组用来接受value    

      for(var key in obj){   

        keys.push(key);   

        values.push(obj[key]);      //取得value

        }   

    alert("keys is :"+keys+" and values is :"+values);    //keys is : name,age,sex,bar and values is : wjy,26,female,10

    可以使用 hasOwnProperty方法,这将会避免原型对象扩展带来的干扰,只会访问对象独有的属性。

    Object.prototype.bar = 10;

    var obj={"name":"wjy","age":26,"sex":"female"};

    var keys=[];

    var values=[];

    for(var key in obj){  

       //只遍历对象自身的属性,而不包含继承于原型链上的属性。 

        if (obj.hasOwnProperty(key) === true){ 

           keys.push(key);   

           values.push(obj[key]);  

        }                

    alert("keys is :"+keys+" and values is :"+values);    //keys is : name,age,sex and values is: wjy,26,female

    注意:object对象没有length属性,所以不能直接通过for(var i=0;i<object.length;i++)的方式来访问,可以通过遍历得到key值的数组的长度来获取object自身属性的个数。

    keys.length;     //"3"

    对象都是唯一独立的,任何2个对象都是不相等的。在 js 中,对象时引用类型,而引用类型比较相等的时候,比较的是内存地址,所以即使两个看起来一摸一样的对象,如果内存地址不相等的话,那么也是不等的。

    {'a': '1'} == {'a': '1'}  //false

  • 相关阅读:
    eclipse中,把java函数代码折叠/展开 介绍【转】
    苹果开发者账号注册&真机调试
    Objective-C编码规范:26个方面解决iOS开发问题
    iTunes获取下载的安装包
    Mac AppStore下载文件的获取
    Mac 切换Windows 使用虚拟机, 不推荐双系统
    Xcode使用版本
    如何提高代码质量
    ARC的内存管理
    Objective-C 类的继承、方法的重写和重载
  • 原文地址:https://www.cnblogs.com/slly/p/5927623.html
Copyright © 2011-2022 走看看