客官快来看一看了, 都给你浓缩好了, 确定不进来搂一眼嘛, 走过路过不要错过哟
in 运算符
in 运算符希望它的左操作数是一个字符串或可以转化为字符串, 希望它的右操作数是一个对象, 如果右侧的对象拥有一个名为左操作数值的属性名, 则表达式返回 true, 否则为 fasle
- var obj = {
- X:1,Y:2
- }
- "X" in obj // true
- "Z" in obj //false
- "toString" in obj //true: 对象继承了 toString()方法
- var data = [7,8,9]
- "0" in data //true: 查找的是下标 0
- 1 in data //true: 查找的下标 1
- 3 in data // fasle: 下标 3 不存在
- "toString" in obj //true: 对象继承了 toString()方法
注意点: 无论是对象还是数组, toString 等从原型链上继承的方法也能查找的到, 但右操作数为数组时, 若为数字或者可转化成数字的字符串则查找的是下标
逻辑与(&&)
在赋值的时候需要要特别注意: 左假返左, 左真返右
- let a = false && 1 //a:false
- let a = true && false //a:false
- let a = true && 1 // a: 1
即赋值时 && 左边为假, 则直接返回左边, 不管右边真假都不在继续看右边, 若左边为真则直接返回右边, 无论右边真假
eval()
eval()是 JS 用来解释运行源代码组成的字符串的一个函数, 它只接受一个参数, 若参数不是字符串则返回该参数, 而是字符串则将字符串当做 JS 源码进行编译.
特点:
使用了调用他的变量作用域环境, 并且具有改变局部变量的能力
直接调用 eval 时, 他会在调用他的上下文作用域执行, 而间接调用则会使用全局对象作为其上下文作用域
严格模式下, 只允许 eval 执行查询或者更改局部变量, 不允许新建
delete
删除数组元素时并不会改变数组的长度, 即相当于将被删除的元素设置为 undefined
var
var 声明的变量无法通过 delete 删除
变量声明语句会进行提升, 赋值语句则还在语句原来的位置执行
- var a = 12;
- delete a;
- console.log(a); //12
- function
函数声明语句会被进行函数声明提升, 也就是说可以在一个函数声明之前调用它
if else
else 总是和就近的 if 想匹配
for in
for in 循环遍历时不会遍历对象的所有属性, 而只是会遍历所有的可枚举属性, 例如 toString 这种内置方法则并不会被遍历出来
try catch finally
不管 try 抛错不抛错, finally 始终会执行
当 try 由于 return,continue,break 语句使得解释器跳出 try 语句块时, 解释器在执行新的目标代码时会先执行 finally 中的逻辑
如果 finally 使用了 return,continue,break 或者 throw 语句使整个程序发生跳转, 不管 try 是否抛出异常, 这个方法仍然会正常返回
with
用于临时扩展作用域链, 步骤: 将扩展的对象添加到作用域链头部, 执行语句, 然后恢复作用域链. 严格模式禁用, 非严格模式也不推荐使用, 因为会降低性能
with 提供了读取对象属性的快捷方案, 但是并不能创建对象的属性
use strict
意为使用严格模式, 只有在实现了 ECMAScript 的 JavaScript 解释器中才起作用
只能出现在代码的开始或者函数体的开始
在严格模式中调用函数的一个 this 是 undefined, 而在非严格模式下则为全局对象
判断浏览器支持不支持严格模式(即判断有没有实现 ECMAScript5)
- var hasStrictMode = (function(){
- "use strict";
- return this === undefined
- }())
对象
JS 对象不仅仅是字符串到值的映射, 除了保持自有的属性, JS 对象还可以从一个称为原型的对象继承属性, 对象的方法通常是继承的方法, 这种'原型式继承' 是 JS 的核心特征.
定义对象时, 属性名可以是包含空字符串在内的任意字符, 但对象中不能存在两个同名的属性
- var test = {
- '':123
- }
- console.lof(test['']) // 123
JS 对象和属性划分
内置对象: 由 ECMAScript 规范定义的对象或类, 如数组, 函数, 日期和正则
宿主对象: 由 JavaScript 解释器所嵌入的宿主环境所定义的, 客户端中表示网页结构的 htmlElement 对象均是宿主对象
自定义对象: 是由运行中的 JavaScript 代码创建的对象
自有属性: 是直接在对象中定义的属性
继承属性: 是在对象的原型对象中定义的属性
Object.create()
它创建一个新对象, 第一个参数是这个对象的原型
创建一个没有原型的对象: Object.create(null)
对象
内置构造函数的原型是只读的
delete
delete 只是断开属性和宿主对象的联系, 而不会去操作属性中的属性, 例子在下方
delete 只能删除自有属性, 不能删除继承属性(要删除继承属性必须从定义这个属性的原型对象上删除, 而且会影响所有继承了这个原型的对象)
delete 也不可以删除那些可配置性为 false 的属性
- a = {
- p:{
- x:1
- }
- }
- b=a.p
- delete a.p
- console.log(a) // 1
枚举属性名称的方法
1. for in 会遍历对象中所有的可枚举属性(包括自有属性和继承属性)
2.object.keys() 返回一个数组, 包括可枚举的自有属性
3.Object.getOwnPropertyNames() 返回所有自有属性的名称
Object.getOwnPropertyDescriptor()
获取自有属性的描述符
Object.defineProperty()
设置属性的特性, 但是只能设置或者修改自有属性
Object.getPrototypeOf()
用来查询对象的原型
isPrototypeOf()
检测一个对象是否是另一个对象的原型
对象的三个属性
原型属性: 用来继承属性的
类属性: 是一个字符串, 表示对象的类型信息
可扩展性: 表示是否可以给对象添加新属性, 内置对象和自定义对象是显式可扩展的, 但是宿主对象的是否可扩展由 JS 引擎来决定
JSON
1.JSON 的语法是 JS 语法的子集, 它并不能表示 JS 里面的所有值, 支持对象, 数组, 无穷大数字, true,false,null, 并且可以序列化和还原, 注意: NAN,Infinity 和 - Infinity 序列化后的结果是 null
2. 日期对象序列化的结果是 ISO 格式的日期字符串, 但 JSON.parse()依旧保留他们的字符串形态, 而不会将他们还原为原始日期对象
3. 函数, RegExp 对象和 Error 对象以及 undefined 不能序列化
4.JSON.stringify()只能序列化对象的可枚举的自有属性 (即调用 Object.keys() 所列出的)
toString()
注意:
- var test = {
- a:1,b:2
- }.toString()
- console.log(test) // [object Object]
由于这种默认的 toString()并不会携带很多有用的信息, 有很多类都携带着自定义的 toString(), 例如 Array.toString(),Date.toString(), 以及 Function.toString()等
toLocaleString()
返回一个表示这个对象的本地化字符串, Object 中默认的 toLocaleString()方法并不做任何本地化自身的操作, 仅仅是调用 toString()方法并返回对应值, 但是 Date 和 Number 则对其做了定制, 可以用它来对时间, 日期, 时间做本地化的转换. Array 类的 toLocaleString()和 toString()不同的是每个数组的元素都会调用 toLocaleString()方法转化为字符串, 而不是调用 toString()
来源: https://www.cnblogs.com/suihang/p/11450647.html