欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

javascript 易错知识点实例小结

程序员文章站 2022-03-20 17:58:19
本文实例总结了javascript 易错知识点。分享给大家供大家参考,具体如下:为什么 typeof null === 'object'原理是这样的,不同的对象在底层都表示为二进制,在javascri...

本文实例总结了javascript 易错知识点。分享给大家供大家参考,具体如下:

为什么 typeof null === 'object'

原理是这样的,不同的对象在底层都表示为二进制,在javascript中二进制前三位都为0的话会被判断为 object 类型, null 的二进制表示是全0,自然前三位也是0,所以执行 typeof 时会返回“ object ”。

对象属性的存在性

如 myobject.a 的属性访问返回值可能是 undefined ,但是这个值有可能是属性中存储的 undefined ,也可能是因为属性不存在所以返回 undefined 。那么如何区分这两种情况呢?

var myobject = {
  a:2
};

// 方案一
("a" in myobject); // true
("b" in myobject); // false

// 方案二
myobject.hasownproperty( "a" ); // true
myobject.hasownproperty( "b" ); // false

// 方案三
object.prototype.hasownproperty.call(myobject, 'b')

对象继承的三种方法

参考如下代码:

		function foo(name) {
			this.name = name;
		}

		foo.prototype.myname = function() {
			console.log(this.name)
		}

		function bar(name, label) {
			foo.call(this, name);
			this.label = label;
		}
        
        // 方法1
		bar.prototype = object.create(foo.prototype)
        
        // 方法2
		bar.prototype = foo.prototype;

        // 方法3
        bar.prototype = new foo();

		//bar.prototype.constructor = bar;

		bar.prototype.sayname = function() {
			console.log(this.name)
		}

		
		var b = new foo('fayin')
	
		b.sayname()

上例中,三种方法都可以使 bar 继承 foo.prototype 上的方法,但它们之间又有微妙的差别:

object.create(..) 会凭空创建一个“新”对象并把新对象内部的 [[prototype]] 关联到你指定的对象(本例中是 foo.prototype )。

bar.prototype = foo.prototype 并不会创建一个关联到 bar.prototype 的新对象,它只是让 bar.prototype 直接引用 foo.prototype 对象。因此当你执行类似 bar.prototype.mylabel = ... 的赋值语句时会直接修改 foo.prototype 对象本身。

bar.prototype = new foo() 的确会创建一个关联到 bar.prototype 的新对象。但是它使用了 foo(..)的“构造函数调用”,如果函数 foo 有一些副作用(比如写日志、修改状态、注册到其他对象、给 this 添加数据属性,等等)的话,就会影响到 bar() 的“后代”,后果不堪设想。

结论

因此,要创建一个合适的关联对象,我们必须使用 object.create(..) 而不是使用具有副作用的 foo(..) 。这样做唯一的缺点就是需要创建一个新对象然后把旧对象抛弃掉,不能直接修改已有的默认对象。

感兴趣的朋友可以使用在线html/css/javascript代码运行工具http://tools.jb51.net/code/htmljsrun测试上述代码运行效果。