美文网首页
类型 对象 值 遍历

类型 对象 值 遍历

作者: LingJJ1100的笔记 | 来源:发表于2017-11-10 00:00 被阅读0次

    类型 和 对象

    JS弱类型:变量并没有固定类型,而值有类型;(Typescript有类型)
    7类型:string、number、boolean、null、undefined、symbol、object、
    基本类型:除对象以外的6种
    通过typeof:可以检测数据类型,除了null(返回的是object)

    内置对象(原生函数):String()、Number()、Boolean()、Object()、Funciton()、Array()、Date()、RegExp()、Error()、symbol()
    是对象是函数是构造函数

    创建的2中方式:
    1.文字语法:var a = { key:value };
    简单的基本类型:创建的是字面量

    2.构造器语法: var a = new Object(); a.key = value
    基本类型封装对象:通过构造器函数创建的是封装了基本类型值的封装对象

    对象内部的[[Class]]属性: 对象的内部分类,区分不同的对象(Date对象、String对象...)
    访问[[Class]]:Object.prototype.toString(..)

    基本类型封装:基本类型值没有.length等方法,需要封装成对应的子对象才具有方法和属性。
    自动封装:使用字面量调用方法时,引擎将自动对象基本类型值进行封装
    没有必要手动封装:浏览器已经对象.length等常见情况进行了优化,直接使用封装对象来"提前优化"反而降低效率
    拆封:valueOf()获取对象中的value值

    PS: 创建方式上 unll 和 undefined:只有文字形式,没有构造函数;Date:只有对象,没有文字形式
    Object、Array、RegExp、Function:文字形式、构造器创建都是对象

    字面量和封装对象 关系:

    var str = "I am a string"; // 创建 字符串字面量
    var strObject = new String("I am a string"); // 创建 字符串对象
    
    console.log(str) // I am a string
    console.log(strObject) // String {"I am a string",等14项...}
    
    console.log(str instanceof String); // false
    console.log(strObject instanceof String) // true
    
    console.log(typeof str); // string
    console.log(typeof strObject); // object
    // 尽管str是字面量,调用方法时会自动转为 对象子类型
    console.log(Object.prototype.toString.call(str)); // [object String]
    console.log(Object.prototype.toString.call(strObject)); // [object String]
    
    console.log(str.length) // 13
    console.log(strObject.length) // 13
    

    数组

    数组也是对象:可以保存键值对数据,但不会修改length值。(不建议:数组和普通对象都根据用途进行了优化)
    Array构造器:一个数字参数为数组长度;多个参数为数组的值
    稀疏的数组:将填充空白单元

    var arr = [1, 2, 3];
    arr.a = bar; // 键值对赋值
    console.log(arr.a) // bar // 保存成功
    console.log(arr.length) // 3  // 但长度并没有变化
    
    var arr2 = new Array(5, 5); // [5, 5]; // 多个参数为数组的值
    var arr3 = new Array(10); // Array [ <10 个空的存储位置> ] // 一个数组参数 数组长度
    
    var arr4 = [];
    arr4.[3] = 3; //Array [ <3 个空的存储位置>, 3 ]
    

    属相描述符 ie9

    获取属性描述符:Object.getOwnPropertyDescriptor(obj, key)
    修改属性描述符(按key值):Object.defineProperty(obj, key, { 修改的属性描述 })
    修改属性描述符(整对象):Object.definePropertys(obj, { 修改的属性描述 })
    4个描述符:
    value:
    writable:是否可修改值(只读)
    enumerable:是否可枚举,(可以被for等循环从操作获取)
    configurable:是否可修改属性描述,单向操作无法撤销! 设置后属性不能删除 严格模式下删除操作会报错

    不变的值

    常量: 不可修改、重定义、删除 —— Writable 和 configurable 设为false
    禁止扩展:Object.preventExtensions(obj)——不能新增,可删可改
    判断扩展状态:Object.isExtensible(obj)
    密封:Object.seal(obj)——禁新增、删除、配置描述符。可改值
    判断密封:Object.isSealed(obj)
    冻结: Object.freeze(obj)——不能修改任何值
    判断冻结:Object.isFrozen()

    值的访问器 ie9

    js通过[[Get]]、[[Put]]方法属相的值。
    设置Getter、Setter方法重写 参数的读写操作
    单个属性:只能应用到单个属性上,不能应用整个对象
    只设置了Getter:将忽略Setter(只能读)
    会忽略两个属性描述符:value 和 writable的属性

    值的存在性

    定义:检测对象是否在对象以及[[Prototype]]原型链中
    注意:检测的是key 值 而不是value
    in:会检测对象 及原型链
    hasOwnPrototype:值检测对象 不检测原型链
    isPrototypeOf:检测是否在原型链上
    枚举:
    propertyIsEnumerable:检测是否枚举属性
    Object.key:返回数组,获取可枚举属性
    Object.value:返回数组,获取可枚举的值
    Object.getOwnpropertySymbols:返回数组,获取所有符号属性
    Object.getOwnPropertyName返回数组,获取所有属性包括不可枚举

    var arr = [10, 11];
    console.log(10 in arr) // false // arr 只有 变量名:0、1 (下标)
    
    var obj = {a: undefined};
    console.log(obj.a); // undefined // 存在的值是undefined
    console.log(obj.b); // undefined // 不存在undefined
    console.log("a" in obj) // true  //存在
    console.log("b" in obj) // false //不存在
    obj.hasOwnProperty("a"); // true // 存在
    obj.hasOwnProperty("b"); // false // 不存在
    

    遍历

    for:遍历下标
    for in:遍历可枚举属性,包括原型链上
    顺序问题:
    for遍历数组:按i的大小顺序遍历数组
    for in遍历数组:会遍历所有下标,和键值对(不建议声明键值对)
    for in:并不能保证和书写循序保持一致
    ES6 for of:按书写顺序遍历,但只能对自身有迭代器的对象使用
    ES5中的辅助迭代器:都是接受回调函数,并将元素应以到函数中,只是回调函数的返回值处理不同
    forEach():忽略回调函数的返回值
    every():遇到回调函数的返回值为false时终止运行
    some():遇到回调函数的返回值为true时终止运行

    相关文章

      网友评论

          本文标题:类型 对象 值 遍历

          本文链接:https://www.haomeiwen.com/subject/vycymxtx.html