类型 和 对象
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时终止运行
网友评论