<>强安全的类型检测强>
JS内置的类型检测机制并不是完全可靠的
<强> typeof 强>
操作符返回一个字符串,表示未经计算的操作数的类型,在大多数情况下很靠谱,但是当然还有例外
正则表达式
typeof/s/===昂?//Chrome 1 - 12,不符合ECMAScript 5.1 typeof/s/===岸韵蟆?//火狐5 +,符合ECMAScript 5.1
零
typeof null===岸韵蟆?//从一开始出现JavaScript就是这样的
在JavaScript最初的实现中,JavaScript中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是0。由于零代码> <代码>代表的是空指针(大多数平台下值为0 x00),因此,<代码>零> 代码的类型标签也成为了0,<代码> typeof零> 代码就错误的返回了<代码> 代码>
对象<强>运算符强>
运算符用来测试一个对象在其原型链中是否存在一个构造函数的原型属性
语法
对象实例构造函数(要检测的对象instanceof构造函数)
引用>但是在浏览器中,我们的脚本可能需要在多个窗口之间进行交互。多个窗口意味着多个全局环境,不同的全局环境拥有不同的全局对象,从而拥有不同的内置类型构造函数。这可能会引发一些问题。
[]instanceof window.frames [0] .Array//假<代码>因为数组。原型!==window.frames [0] .Array.prototype> 代码,因此你必须使用<代码> Array.isArray (myObj)> 代码或者<代码> Object.prototype.toString.call (myObj)===> 代码“(对象数组)”来判断myObj是否是数组
解决以上两个问题的方案就是<代码> Object.prototype.toString 代码><强> Object.prototype.toString 强>
方法返回一个表示该对象的字符串
可以通过<代码> toString() 代码>来获取每个对象的类型。为了每个对象都能通过<代码> Object.prototype.toString() 代码>来检测,需要以<代码> Function.prototype.call() 代码>或者<代码> Function.prototype.apply() 代码>的形式来调用,传递要检查的对象作为第一个参数,称为<代码> thisArg 代码>var toString=Object.prototype.toString; toString。调用(新日期);//日期(对象) toString。调用(新的字符串);//对象(字符串) toString.call(数学);//(对象数学) toString.call (//);//(对象RegExp) toString.call ([]);//(对象数组) 自于JavaScript 1.8.5//toString.call(定义);//(对象定义) toString.call(空);//(Null对象)<强>作用域安全的构造函数强>
构造函数其实就是一个使用<代码> 代码>新操作符调用的函数。当使用<代码> 代码>新调用时,构造函数内用到的<代码> 代码>对象会指向新创建的对象实例
函数的人(姓名、年龄){ this.name=名称; 这一点。年龄=年龄; } 让人=new人(“addone”, 20); person.name//addone当你使用<代码> 代码>新操作符的时候,就会创建一个新的<代码> 代码>人对象,同时分配这些属性,但是如果你没有使用新<代码> 代码>
让人=人(“addone”, 20); person1.name//不能读取属性的名称定义 window.name//addone这是因为<代码> 代码>是在执行时确认的,当你没有使用<代码> 代码>,那么<代码> 代码>在这当前情况下就被解析成了<代码>窗口> 代码,属性就被分配到<代码> 代码>窗口上了
作用域安全的构造函数在进行更改前,首先确认<代码> 代码>对象是正确类型的实例,如果不是,就创建新的对象并且返回
函数的人(姓名、年龄){ 如果这个运算符(人){ this.name=名称; 这一点。年龄=年龄; 其他}{ 返回新的人(姓名、年龄); } } 让person1=new人(“addone”, 20); person1.name//addone 让person2=人(“addone”, 20); person2.name//addone<代码>这instanceof人> 代码检查了<代码> 代码>对这象是不是人<代码> 代码>的实例,如果是则继续,不是则调用新<代码> 代码>
<强>惰性载入函数强>
假如你要写一个函数,里面有一些判断语句
JS高级技巧(简洁版)