• 4JavaScript的对象


    对象类型

    对象

    全局对象(global object)

    当JavaScript解释器启动时(或web加载新页面的时候)会创建一个新的全局对象,并给一组初始属性

    • 全局属性,比如undefined,Infinity和NaN
    • 全局函数,比如isNaN(),parseInt()和eval()
    • 构造函数,比如Date(),RegExp(),String(),Object()和Array()
    • 全局对象,比如Math和JSON

    在代码的顶级,可以使用JavaScript关键字this来引用全局对象

    var global = this; //定义一个引用全局对象的全局变量
    

    而在客户端JavaScript中,在其表示的浏览器窗口中的所以JavaScript代码中,Window对象充当了全局对象,这个全局Window对象中有一个window属性来引用自身,可以用来替代this来引用全局对象

    包装对象

    存取字符串、数字或布尔值的属性时创建的临时对象称作包装对象

    JavaScript中对象是由键值对组成,通过.来引用属性或方法.

    但字符串和数字为什么也能调用方法和属性呢?

    因为只有调用了字符串,它就会通过调用new String()来新建一个对象,这个对象继承了字符串的方法,并用来处理属性的引用,一旦引用结束,这个对象就会被销毁

    var s = 'test';
    s.len = 4;
    var t =s.len;
    
    var a = new String(s);//创建显示包装对象
    a==s;//true 因为值相同
    a===s;//false  因为类型不同
    

    此时输出t,结果会为undefined,因为在s引用时创建新的对象,并添加属性len,但当引用结束,该对象销毁,就无法获取这个s.len

    同理,数字和布尔值也有各自的方法:通过Number()和Boolean()构造函数创建对象,这些方法的调用都是来自这个临时对象,而null和undefined没有包装对象

    不可变的原始值和可变的对象引用

    JavaScript中的原始值(数字,字符串,布尔值,null和undefined)与对象(对象,数组,函数)有根本区别,原始值是不可改变的,没有任何方法可以对原始值进行修改.

    原始值之间的比较只有在它们的值相等时才相等,比如字符串的每一项索引和长度都相等

    对象是可变的--它们的值是可以修改的:

    var o = {x:1};
    o.x = 2;
    o.y = 1;
    

    而对象的比较并非值的比较,即使两个对象包含一样的属性一样的值,它们也不是相当的.同理,数组也一样

    所以,只有当它们引用同一个基对象时,它们才会相等

    var a = [];
    var b = a ;//只是赋值的引用,并没有复制一次
    a[0]=1;
    b[0]//1
    a===b//true
    

    类型转换

    image-20200924181405247

    null == undefined
    '0' == 0 //  转换成数字
    0 == false  //布尔值转换成数字
    '0' == false  //字符串和布尔值都转换成数字
    

    以上结果全为true

    ps:虽然undefined在希望是布尔值的时候会转换成false,但不代表undefined == false ,if语句可以将undefined转换成false,但==从不试图将操作数转换成布尔值

    显式类型转换

    以上都是隐式类型转换,而显式类型转换最简单的方法就是用Boolean(),String(),Number(),Object()

    Number("3") // 3
    String(false)  //'false'
    Boolean([])  //true
    Object(3)  //new Number(3)
    

    除了null或undefined,之外的任何值都有tostring()方法,这个方法的结果和String()方法返回结果一致,如果将null或undefined转换成对象会抛出类型错误,但Object()不会抛出异常,它只会返回一个空对象

    数字转换成字符串的方法中,Number类定义了三种方法:

    • toFixed(): 指定小数点的位数将数字转换成字符串

    • toExpotential(): 使用指数计数法将数组转换成指数形式的字符串

    • toPrecision:指定有效数字转成字符串

    var n = 123456.789
    n.toFixed(0) = "123457"
    n.toFixed(2) = "123456.79"
    n.toExpotential(1) = "1.2e+5"
    n.toPrecision(4) = "1.235e+5"
    n.toPrecision(7) = "123456.8"
    

    字符串转换成数字:parseInt()和parseFloat()将内容转换成数字

    而对象转成原始值则非常简单,因为所有的对象都转成true,包装对象也是如此,new Boolean(false)转成true,

    对象转成字符串使用toString()方法就行,但toString()在不同的对象中有不同的作用

    ({x:2,y:2}).toString() = "[object object]"
    [1,2,3].toString() = "1,2,3"
    (function(x){f(x);}).toString() = "function(x){
     f(x); 
    }"
    /d+/g.toString() = "/\d+/g"
    new Date(2010,0,1).toString() = "Fri Jan 01 2010 00:00:00 GMT-0800(PST)"
    

    还有一种是valueOf(),这个函数会将对象,如果能返回一个原始值就返回原始值,不能就返回对象本身

  • 相关阅读:
    IOS中UIImage用代码压缩
    自定义UILabel设置垂直方向的居上,居中,居下
    IOS开发之数据加密与解密:AES256+Base64转码
    IOS开发之网络数据Json处理
    Unity3d中CharacterController的移动和碰撞分析
    关于Unity3d中物体之间碰撞检测的方法
    WPF 调用Win32控件
    C# 扩展方法
    颜色空间转换 RGB到HSV
    加速计算技术-- Intel 的IPP库
  • 原文地址:https://www.cnblogs.com/dwfeng/p/13725876.html
Copyright © 2020-2023  润新知