严格模式

  1. 所有的变量都有声明,如果给一个未声明的变量、函数、函数参数、catch从句参数或全局对象的属性赋值,将会抛出一个引用错误异常
  2. this问题
    1. 调用的函数(不是方法)中的一个this值是undefined
    2. call apply传入null undefined保持原样不被转换为window
  3. 规范相关
    1. 禁止使用with语句
    2. 不允许使用八进制整数直接量
    3. 对象同名属性
    4. 函数同名参数会报错
    5. 增加了保留字(比如protected、static和interface)
  4. 对象属性特性相关(值、读写、枚举、配置)即对象可扩展特性相关
    1. 给只读属性赋值和不可扩展的对象创建一个新成员都将抛出一个类型错误异常
    2. delete相关 删除不可配置的属性会报错, 删除未声明对象报错
    3. 当delete运算符后跟随非法的标识符(比如变量、函数、函数参数)时,将会抛出一个类型错误异常
    4. 给一个不可扩展的对象新增属性会报错
  5. 传入eval()的代码不能在调用程序所在的上下文中声明变量或定义函数,eval的值是不可以修改的
  6. 函数相关
    1. 函数中的arguments对象 拥有传入函数值 的静态副本
    2. 限制了对调用栈的检测能力 arguments.callee arguments.caller (callee 属性指向正在执行的函数, caller 是非标准的,它指代当前正在执行函数的函数callee在匿名函数中, 匿名函数可以通过callee递归调用自身)

image.png

数据属性的四个特性

value writable enumerable configurable
Object.defineProperty()或Object.defineProperties违反规则的使用都会抛出类型错误异常

  • 如果对象是不可扩展的,则可以编辑已有的自有属性,但不能给它添加新属性。
  • 如果属性是不可配置的,则不能修改它的可配置性和可枚举性,不可以删除他。
  • 如果在取器属性是不可配置的,则不能修改其getter和setter方法,也不能将它转換为数据属性。
  • 如果数据属性是不可配置的,则不能将它转换为存取器属性。
  • 如果数据属性是不可配置的,则不能将它的可写性从false修改为true,但可以从true修改为false.
  • 如果数据属性是不可配置且不可写的,则不能修改它的值.然而可配置但不可写属性的值是可以修改的(实际上是先将它标记为可写的,然后修改它的值,最后转换为不可写的)

可扩展性 通过将对象传入Object.esExtensible(),来判断该对象是否是可扩展的。 Object.preventExtensions() 设置对象不可扩展

Object.seal()和Object.preventExtension类似除了能够将对象设置为不可扩展的,还可以将对象的所有自有属性都设置为不可配置的。 对应Object.isSealed()来检测

Object.freeze()再加一条所有自身属性设置为只读 Object.isFrozen()

遍历

  • in  for in
  • Object.keys()
  • Object.assign
  • Object.getOwnPropertyNames() hasOwnProperty() propertyIsEnumerable()
  • Object.getOwnPropertySymbols() Reflect.ownKeys()
  • JSON 序列化

序列化
JSON的语法是]avaScript 语法的子集,它井不能表示JavaScript里的所有值。
支持对象、数组,
字符串、无穷大数字、true.false和null,并且且它们可以序列化和还原。
NaN、Infinity和Infinity序列化的结果是null,
日期对象序列化的结果是ISO格式的日期字符串(参照Date.toJSON()函数),但JSON.parse()做然保留它们的字符串形态,而不会将它们还第为原始日期对象。
函數、RegExp,Error对象和undefined值不能序列化和还原。
JSON.stringify()只能序列化对象可枚举的自有属性。对于一个不能序列化的属性来说,库列化后的输出丰符串中会将这个属性省略掉。
JSON.stringify()和JSON.parse()都可以接收第而个可选参数,通过传入需要序列化或还原的属性列表来定制自定文的序列化或还原操作。

数组特性

length
当有新的元素插入列表中时,自动更新length
属性设置length 为一个较小值时将截断数组
从Array.prototype中继承一些有用的方法 其类属性为Array arguments docment.getElementsByNames() 是类数组对象

稀疏数组

js方法非常灵活以 Array.splice举例

  1. arr.slice(x, y) // 取数组片段
  2. // x为 其实位置
  3. // y可以省略,可以为负数
  4. /*
  5. 数组增删改万能方法
  6. arr.splice(x, y, a, b, c, ...)
  7. splice()能够从数组中删除元素、插入元素到数组中或者同时完成这两种操作。
  8. 在插入或删除点之后的数组元素会根据需要增加或减小它们的索引值,因此数组的其他部分仍
  9. 然保持连续的。
  10. splice()的第一个参数指定了插人和(或)删除的起始位置。
  11. 第二个参数指定了应该从数组中删除的元素的个数。
  12. 如果省略第二个参数,从起始点开始到数组结尾的所有元素都将被删除。
  13. splice()返回一个由删除元素组成的数组,或者如果没有删除元素就返回一个空数组。例如:
  14. var arr = [0,1,2,3,4,5,6,7]
  15. arr.splice 返回 [] arr不变
  16. arr.splice(5)//等价于 arr.splice(5, arr.length - 5) 现在arr = [0, 1, 2, 3, 4]
  17. arr.splice(0, 2, 0.1, 1.1) // 返回 [0, 1] 现在arr = [0.1, 1.1, 2, 3, 4]
  18. */