Javascript方法的复杂值
Javascript方法的复杂值,javascript,Javascript,({}).valueOf.call(myvar)做什么 它将任何值转换为对象(对象保持不变,原语转换为包装类型的实例) 我的问题是怎么做?有人能给出更详细的答案吗?这是如何在幕后完成的。因为valueOf()方法的目的是返回基本值,而不是对象 console.log{name:"sameer"}.valueOf() //returns an object but cant be displayed since toString() method will be called by js so [
({}).valueOf.call(myvar)
做什么
它将任何值转换为对象(对象保持不变,原语转换为包装类型的实例)
我的问题是怎么做?有人能给出更详细的答案吗?这是如何在幕后完成的。因为valueOf()
方法的目的是返回基本值,而不是对象
console.log{name:"sameer"}.valueOf() //returns an object but cant be displayed since toString() method will be called by js so [object Object] gets displayed which is a string ,how to display the exact return value from valueOf() method .Is there a way?
回答您的第一个问题 JavaScript有两种主要的变量类别类型:原语和对象。你会经常听到这个,在JS中,一切都是一个对象。这并不完全准确。还有一些基本数据类型,它们只保存值 它们没有方法,也不是包装类型的实例。所以,在对它们调用任何方法之前,需要将它们转换为包装器类型的对象。在JavaScript中,这种转换是自动的,称为自动装箱 请允许我演示:
var firstString = "Test";
typeof firstString == "string"; // true
var secondString = new String("Test");
typeof secondString == "string"; // false
secondString.prototype.toString.call// [object String];
注意发生了什么。上面实际上有两种类型。一个是字符串
,另一个是[对象字符串]
。这告诉您两件事:secondString instanceof String
为true
。这是一种包装类型。在核心语言中,您可以看到String
继承自Object
但是第一个字符串
只是一个内存引用,仅此而已。当您调用像firstString.replace()
这样的方法时,firstString
会自动转换为其包装类型。这是自动装箱
上述行为代表以下几对:
数字自动装箱
var x=5;变量y=新编号(5)代码>,
布尔自动装箱
var x=false;var y=新布尔值(false)代码>
RegExp自动装箱
var x=new RegExp(“etc”);变量y=/etc/代码>
Object.prototype.valueOf
valueOf
方法是为任何对象定义的。为了调用它,它将把所有原语类型转换为它们的包装器类型,并保持现有对象不变。现在它将只返回对象引用中保存的值。所以它非常简单,是一种强制自动装箱的方法。你在强迫我之前提到的转换
回答第二个问题
显示未过滤的结果很简单。使用console.dir()
。
看
它完全等同于Object.prototype.valueOf.call(myVar)代码>。现在您已经知道了valueOf
的作用
假设您知道Function.prototype.call
的工作方式,您的语句将调用对象范围内的valueOf
方法,作为this
参数传递给Function.prototype.call
(第一个参数是this
对象引用)
你好!!我们再次面对强大的对手。在开始之前,让我们消除一个错误想法:
valueOf()方法用于返回原语值,而不是对象
console.log{name:"sameer"}.valueOf() //returns an object but cant be displayed since toString() method will be called by js so [object Object] gets displayed which is a string ,how to display the exact return value from valueOf() method .Is there a way?
不准确valueOf
如果向对象传递了原语值,则返回该对象。如果执行valueOf(object)
,则会得到相同的对象:valueOf(object)==object
。你可以很容易地看到:
var obj = {};
obj.valueOf() === obj; //true
现在,有一个更有趣的问题:valueOf
是如何定义的?让我们看看ES5规范以及v8和spidermonkey源代码
valueOf
(,):
正如我们所见,它只返回规范中定义的ToObject
。兔子洞出现了
ToObject
(,)
头奖。我们可以在这里看到整个流程。如果是字符串、数字、布尔值等,则返回包装器($string
和$boolean
等表示实际字符串或数字;请参阅);如果是无效参数,抛出错误;否则,返回参数
spidermonkey的来源在兔子洞的深处。它将ToObject
定义为:
JS_ALWAYS_INLINE JSObject *
ToObject(JSContext *cx, HandleValue vp)
{
if (vp.isObject())
return &vp.toObject();
return ToObjectSlow(cx, vp, false);
}
因此,如果它不是对象,请调用ToObjectSlow
。扣上爱丽丝,会有C++。我们需要看看什么是:
在查看参数是否为null或未定义后,更间接。结局是:
JSObject*
PrimitiveToObject(JSContext*cx、常量值和v)
{
if(v.isString()){
根str(cx,v.toString());
返回StringObject::create(cx、str);
}
if(v.isNumber())
返回NumberObject::create(cx,v.toNumber());
JS_断言(v.isBoolean());
返回BooleanObject::create(cx,v.toBoolean());
}
与v8版本几乎相同,只是分类不同
现在,正如我之前所说的,我认为你的问题更多的是关于表现你所看到的物体的媒介。Firebug和chrome的开发工具非常适合显示对象。然而,如果你试图提醒它,你会看到不幸的[object object]
,因为这就是({}).toString()
给你的(因为它给出了一个[object InternalClassName]
格式的字符串,就像我们以前看到的那样)
作为奖励,可以尝试console.dir({foo:'bar'})
console.log({name:'sameer}).valueOf()
-->对象{name:“sameer”}
但{}
不是原语,因此它返回toString()
,因为没有多少对象可以返回原语。为什么你认为valueOf
应该只返回原语?@Maizer你昨天问了一个奇怪的类似问题。没有帮助吗?@limelights但这不是Dublicate结果是由于调用了toString方法。alert({}.valueOf()),输出是字符串againit在任何浏览器中都不起作用。console.dir()它起什么作用?我正在使用
function ObjectValueOf() {
return ToObject(this);
}
function ToObject(x) {
if (IS_STRING(x)) return new $String(x);
if (IS_SYMBOL(x)) return new $Symbol(x);
if (IS_NUMBER(x)) return new $Number(x);
if (IS_BOOLEAN(x)) return new $Boolean(x);
if (IS_NULL_OR_UNDEFINED(x) && !IS_UNDETECTABLE(x)) {
throw %MakeTypeError('null_to_object', []);
}
return x;
}
JS_ALWAYS_INLINE JSObject *
ToObject(JSContext *cx, HandleValue vp)
{
if (vp.isObject())
return &vp.toObject();
return ToObjectSlow(cx, vp, false);
}
JSObject *
js::ToObjectSlow(JSContext *cx, HandleValue val, bool reportScanStack)
{
if (val.isNullOrUndefined()) {
...error throwing magic here...
return NULL;
}
return PrimitiveToObject(cx, val);
}
JSObject *
PrimitiveToObject(JSContext *cx, const Value &v)
{
if (v.isString()) {
Rooted<JSString*> str(cx, v.toString());
return StringObject::create(cx, str);
}
if (v.isNumber())
return NumberObject::create(cx, v.toNumber());
JS_ASSERT(v.isBoolean());
return BooleanObject::create(cx, v.toBoolean());
}