1、in
eg:x in o (检测o对象是否拥有x属性)
in 运算符(in的左侧是字符串或者可以转为字符串 ,右侧是对象 )
*可以检测继承的属性
*注意的是对数组检测的是下标值
2、instanceof (左侧是对象,右侧是标识对象的类即构造函数)
* 如果左侧不是对象则返回false,右侧不是函数则抛出一个类型错误异常 * 返回的类型有:String Number Boolean Function Object Array Date ,只能返回new的对象的类型,不能返回直接量的类型 3、eval() (解释运行js源代码组成的字符串)
其实eval()是一个函数也是一个运算符,它作为函数来讲,缺点是1、动态执行的代码是不能分析的,就是说解释器不能对调用了eval()的函数进行优化;2、它可以被赋予其他的名字,即var a = eval;这样解释器也无法优化调用a()的函数,所以ES3规定任何解释器都不允许对eval()赋予别名,如果eval()函数通过别名调用的话会抛异常EvalError。但ES5是反对EvalError的,所以ES5规定直接使用eval()的,总是在调用它的上下文作用域内执行,如果给eval赋予其他名字然后再调用的话,作用的是全局对象,并且无法读写、定义局部变量和函数
eg:function fun(){ var sd = eval; var x =2; sd("x = 4;");
console.log(x); //2 } fun(); console.log(x); //4 sd("x = 4;");相当于隐式定义了全局x并赋值为4
*ES5严格模式下,不可以给eval赋予其他名字并将eval列为保留字,并且局部环境中也只能查询和修改局部变量,不能新定义变量或函数
*IE9之前的版本调用eval的别名时,不会操作全局的对象,仅仅当做局部的eval()调用,并且也不会抛异常,但是IE定义了一个execScript()全局函 数来完成全局eval()的功能,不同的是execScript()总是返回null
eval()只接受一个参数,这个参数要不是字符串的话,它会直接返回这个参数,否则就把字符串当成js代码进行编译,编译成功的话会返回字符串中的最后一个表达式或语句的值,没有值的话就返回undefined,编译失败的话会抛出语法异常(SyntaxError)
eval()的作用域环境和调用它的变量是一样的,它在局部环境中调用就会影响局部变量的值,在全局环境中调用就会影响全局变量的值
4、typeof x x可以是任意类型的操作数
它只能返回 'undefined' “string” 'number' 'boolean' 'function' 'object' 不能具体细分object,并且对于null会返回object
参考js权威指南,自己总结