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());
}