javascript - javascript中Object(this)的目的是什么?
问题描述
研究MDN web docs上写的find方法的polyfill,有一段我没有关注,让我分享代码
if (!Array.prototype.find) {
Object.defineProperty(Array.prototype, 'find', {
value: function(predicate) {
if (this == null) {
throw TypeError('"this" is null or not defined');
}
var o = Object(this);
var len = o.length >>> 0;
if (typeof predicate !== 'function') {
throw TypeError('predicate must be a function');
}
var thisArg = arguments[1];
var k = 0;
while (k < len) {
var kValue = o[k];
if (predicate.call(thisArg, kValue, k, o)) {
return kValue;
}
k++;
}
return undefined;
},
configurable: true,
writable: true
});
}
我的问题是表达式var o = Object(this);
。这样做而不是这样做的目的是什么var o = this
?在两种描述的情况下打印值都会返回相同的对象。
这是一种缩写的调用方式var o = new Object(this);
吗?
我已经从方法中删除了注释以缩短文本,这里是 polyfill 实现的链接。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find#Polyfill
谢谢!
解决方案
在严格模式下,this
它并不总是一个对象。Object(this)
确保它o
是一个对象,而不是一个原语。
this
这是一个原始的示例:
"use strict";
Object.defineProperty(String.prototype, "nishCap", {
writable: true,
configurable: true,
value() {
console.log(typeof this); // "string"
const o = Object(this);
console.log(typeof o); // "object"
return o.substring(0,1).toUpperCase() + o.substring(1);
}
});
const capped = "foo".nishCap();
请注意,这甚至适用于数组方法,因为您可以在非数组上调用它们,例如Array.prototype.find.call("foo", ch => ch === "o")
.
这是一种缩写的调用方式
var o = new Object(this);
吗?
不,new Object
总是创建一个新对象(并且不使用你给它的参数)。当您作为函数调用Object
时,它会将其参数强制转换为对象。所以一个原始字符串变成了一个String
对象,一个原始数字变成了一个Number
对象,等等。
这样做而不是这样做的目的是什么
var o = this
?
该 polyfill 非常严格地遵循规范,它从以下内容开始:
- 让 O 成为 ? ToObject(此值)。
在大多数情况下,它并不重要,但如果有一些边缘情况将其排除在外会导致可观察到的行为与规范不一致,我不会感到惊讶。
推荐阅读
- python - 使用 itertools.groupby 输出不正确
- android - 如何使用媒体播放器应用程序同步系统音量
- linux - CPU时间更改后GLUT不更新
- python - 在数据帧中使用多个插值函数
- c++ - C++ 钻石问题 - 如何只调用一次基本方法
- r - 将大数据帧转换为 R 中规则的事务格式
- python - kivy 屏幕管理器和弹出窗口
- python - 与两个连接的 python3 脚本一起使用时的 argparse 冲突
- swift - 使用 Swift 5+ 将数据写入 OutputStream
- python - 如何在 python reticulate 中使用闪亮的下载按钮?