您的位置:首页 > Web前端 > JavaScript

[13年迁移]公司服务器坏了,无聊按面向对象的方法分析下javascript的空值和假值

2014-10-04 20:34 666 查看
首先要知道javascript的自动转换,就是该处需要什么类型,那么javascript会自动把目前类型传入该需要类型的构造函数,来生成需要类型
猜想1:undefined在javascript里是一个类估计(不继承object),null是object对象的一个子类,用面向对象的方法看待的话是这样
只有0和空字符串等于false;undefined和null对象并不等于false对象,而null和undefined是相等的
这个怎么理解呢?
猜想2: 在你使用undefined对象和其他object对象进行互动的时候,他会先把自己转变成object对象(Object(undefined);),将返回null
<script>
alert(typeof(Object(undefined)) === 'object');
alert(typeof undefined === 'object');
alert(String(Object(null)===null));

[b]alert(String(Object(undefined)===null));//Object object
</script>
将返回true和false,false,false
这个猜想貌似错误了,Object构造函数知识不足(可能就没有带参数的构造方法)String构造函数知识不足,无法理解返回值
[/b]虽然空值不能调用toString方法,但是却可以使用String构造函数进行构造。[b]像decodeURI这样的函数,如果传入的是undefined或者null,返回的是“undefined”和“null”字符串。这点很容易用错。
[/b]alert(String(undefined)); //"undefined"
alert(String(null)); //null
这个估计只是是构造函数里的特殊判断,无意义

假值和空值有一个共性,那就是在[b]作为if的条件分支时,均被视为false;应用“!”操作之后得到的均为true[/b]。
Boolean构造函数的特殊定义,无意义,无法验证是先转换object对象还是直接就是的defined对象传入,一个简单的验证法被提出,去研究
arguments对象是否为object,新的理论被提出,关于typeof()(仅仅返回一个string..)无法验证继承属性
<script>
alert(typeof(false) === 'object'); //false
alert(typeof(0) === 'object'); //false
</script>

总猜想错误,全部错误,重新收集知识:
undefined对象是引擎根据一定条件和判断后,把引用指向过去的,然后其他的类再进行一些catch ex的操作,估计实现方法是这样的
在 ECMAScript 中,不能访问对象的物理表示,只能访问对象的引用。每次创建对象,存储在变量中的都是该对象的引用,而不是对象本身。

只能用 === 运算来测试某个值是否是未定义的,因为 == 运算符认为 undefined 值等价于 null。

注释:null 表示无值,而 undefined 表示一个未声明的变量,或已声明但没有赋值的变量,或一个并不存在的对象属性。

一种面向对象语言需要向开发者提供四种基本能力:

封装 - 把相关的信息(无论数据或方法)存储在对象中的能力

聚集 - 把一个对象存储在另一个对象内的能力

继承 - 由另一个类(或多个类)得来类的属性和方法的能力 //这个太假了,顶层属性并不继承object的,object对象的重新理解,只是javascript为了面向对象而加入的一种设计模式

多态 - 编写能以多种方法运行的函数或方法的能力

ECMAScript 支持这些要求,因此可被是看做面向对象的。


绑定(early binding)是指在实例化对象之前定义它的属性和方法,这样编译器或解释程序就能够提前转换机器代码。在 Java 和
Visual Basic 这样的语言中,有了早绑定,就可以在开发环境中使用
IntelliSense(即给开发者提供对象中属性和方法列表的功能)。ECMAScript 不是强类型语言,所以不支持早绑定。
另一方面,
晚绑定(late
binding)指的是编译器或解释程序在运行前,不知道对象的类型。使用晚绑定,无需检查对象的类型,只需检查对象是否支持属性和方法即可。
ECMAScript 中的所有变量都采用晚绑定方法。这样就允许执行大量的对象操作,而无任何惩罚。
简单来说javascript顶层元素封装成了8大类,而之间并无继承关系.那么就会为了比如toString写8次..
那么这些判断的实现和转换无非就是各种构造方法中的特定判断而已..

在 ECMAScript 中,等号由双等号(==)表示,当且仅当两个运算数相等时,它返回 true。非等号由感叹号加等号(!=)表示,当且仅当两个运算数不相等时,它返回 true。为确定两个运算数是否相等,这两个运算符都会进行类型转换。

执行类型转换的规则如下:

如果一个运算数是 Boolean 值,在检查相等性之前,把它转换成数字值。false 转换成 0,true 为 1。

如果一个运算数是字符串,另一个是数字,在检查相等性之前,要尝试把字符串转换成数字。

如果一个运算数是对象,另一个是字符串,在检查相等性之前,要尝试把对象转换成字符串。

如果一个运算数是对象,另一个是数字,在检查相等性之前,要尝试把对象转换成数字。

在比较时,该运算符还遵守下列规则:

值 null 和 undefined 相等。

在检查相等性时,不能把 null 和 undefined 转换成其他值。

如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。

如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。 //很好直接说了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: