请问个alert的问题

bigcctv 2010-11-23 01:11:03

<script>

function b() {
Number.prototype.toString = function() { alert("xiaod") };
var ss = { toString: function() { alert("xiaoc"); } }; var f = 33; alert(f); alert(ss); }
window.onload = b;
</script>

在第一个弹出框中(alert(f); ):显示的是“33”,证明alert里没有内部调用33的toString函数,而之后的alert却弹出两个对话框,第一个显示“xiaoc”,证明调用了toString,而接着又弹出一个框显示“undefined”。
请问:
1、为什么第二次调用了toString而第一次不调用呢?
2、为什么第二次会弹出第二个弹出框显示undefined呢??
请指教!~谢谢~~~~
...全文
235 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigcctv 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 ahopedog 的回复:]
原始类型应该没有toString() 方法吧,这应该是由虚拟机实现的,原是类型可以作为栈中的一个操作数直接操作,不应该在堆里存在对象的。
[/Quote]
呃~~~楼上有的人说查到资料有~~我百度了下,有些人说有~~~
究竟有没有呢??请大家指教!~
wjhwjhwjh6 2010-11-24
  • 打赏
  • 举报
回复
16楼言中!!!
ahopedog 2010-11-24
  • 打赏
  • 举报
回复
原始类型应该没有toString() 方法吧,这应该是由虚拟机实现的,原是类型可以作为栈中的一个操作数直接操作,不应该在堆里存在对象的。
bigcctv 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 crazywa 的回复:]
16楼勉强可以算作正解。
源自原始类型、引用类型。
还可以试试

JScript code

<script>
String.prototype.toString = function(){
return 'toString~~';
}
Number.prototype.toString = function(){
return 'toString~~';
……
[/Quote]
哦哦~~意思是var A=11; 这样A并不是Number类型,而是原始类型吧?
那按你的意思,由于A不是原始类型字符串,因此alert(A)的时候也调用了原始类型数字的A的toString了,对么?那有什么方法可以重写原始类型的toString么?呵呵~~
另外谢谢以上各位的详细回答先~~~
逍遥庄主 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 llyy112233 的回复:]
额,查一下资料,发现原始类型number也是有toString方法的,只是alert原始类型的时候js没有去调用它的toString方法。
[/Quote]
查了些资料 说alert()方法默认是调用toString()方法的
Crazywa 2010-11-24
  • 打赏
  • 举报
回复
16楼勉强可以算作正解。
源自原始类型、引用类型。
还可以试试

<script>
String.prototype.toString = function(){
return 'toString~~';
}
Number.prototype.toString = function(){
return 'toString~~';
}

var s = new String('4564646464');
var b = 'sfdf';
var s1 = new Number(111111);
var b1 = 111111;
alert(s);
alert(b);
alert(s1);
alert(b1);
</script>

首先你需要知道的是alert函数的参数必须是字符串,如果不是字符串,那么会自动调用toString方法将其转换成字符串,然后弹出去。
虽然js号称一切皆对象,但是用字符串直接量方式(xx = 'fsdfsd'之类)声明的,和用数字直接量方式声明的变量都是原始类型,而非引用类型,也就是说,你可以看做“不是对象”。
只有用明确的 new String() new Number()方式声明的字符串、数字才是真正的对象,也才会遵循String.prototype.toString
L0320 2010-11-24
  • 打赏
  • 举报
回复
楼上回答不错 学习下
llyy112233 2010-11-24
  • 打赏
  • 举报
回复
补充:

Number.prototype.toString = function(){
return 'toString';
}

String.prototype.toString = function(){
return 'toString';
}

Boolean.prototype.toString = function(){
return 'toString';
}

var n1 = 1;
alert(n1); //原始类型,没有调用toString
alert(n1.toString()); //如果调用toString的话

var n2 = new Number(1);
alert(n2); //引用类型,调用toString


var s1 = 'test';
alert(s1); //原始类型,没有调用toString
alert(s1.toString()); //如果调用toString的话

var s2 = new String('test');
alert(s2); //引用类型,调用toString

var b1 = true;
alert(b1); //原始类型,没有调用toString
alert(b1.toString()); //如果调用toString的话

var b2 = new Boolean('true');
alert(b2); //引用类型,调用toString
llyy112233 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 babyboy9685 的回复:]
引用 13 楼 llyy112233 的回复:
额,查一下资料,发现原始类型number也是有toString方法的,只是alert原始类型的时候js没有去调用它的toString方法。

查了些资料 说alert()方法默认是调用toString()方法的
[/Quote]

alert(test);当test为原始类型时,不会调用toString,当test为引用类型时,才会调用toString。
有例子为证,如下:

Number.prototype.toString = function(){
return 'toString';
}

String.prototype.toString = function(){
return 'toString';
}

Boolean.prototype.toString = function(){
return 'toString';
}

var n1 = 1;
alert(n1); //原始类型,没有调用toString

var n2 = new Number(1);
alert(n2); //引用类型,调用toString

var s1 = 'test';
alert(s1); //原始类型,没有调用toString

var s2 = new String('test');
alert(s2); //引用类型,调用toString

var b1 = true;
alert(b1); //原始类型,没有调用toString

var b2 = new Boolean('true');
alert(b2); //引用类型,调用toString
llyy112233 2010-11-24
  • 打赏
  • 举报
回复
额,查一下资料,发现原始类型number也是有toString方法的,只是alert原始类型的时候js没有去调用它的toString方法。
llyy112233 2010-11-24
  • 打赏
  • 举报
回复
首先要分清楚两种定义的区别:
var f = 11; 这里定义了一个js的原始类型
var n = new Number(11); 这里定义了一个js的引用类型
而对于alert(test), 当test是number的原始类型时,js是不会调用toString方法的,原始类型number也没有toString的方法;当test是引用类型时(即Object),js才会调用该引用类型的toString方法。
Number.prototype.toString = function() { alert("xiaod") }; 这句话是定义引用类型Number的toString方法。
例子如下:


function b() {
Number.prototype.toString = function() { alert("xiaod") };
var ss = { toString: function() { alert("xiaoc"); } };


var n = new Number(11);
var f = 11;

alert(typeof n); //输出object
alert(typeof f); //输出number

alert(n instanceof Object); //true, n是引用类型
alert(f instanceof Object); //false, f是number的原始类型

alert(n); //先调用toString, 输出xiaod , toString没有返回值,再输出undefined
alert(f); //没有调用toString, 直接输出11

}
window.onload = b;

gohappy2008 2010-11-23
  • 打赏
  • 举报
回复
toString 没有返回值
hch126163 2010-11-23
  • 打赏
  • 举报
回复
var f = 33; alert(f); 这儿只是弹出f的值而已!根本没调用 Number.prototype.toString这个方法!

你的写法是下面的这个的问题。toString 和系统函数冲突了,我也纳闷为什么会自动调用toString 呢?

var ss = { toString: function() { alert("xiaoc"); }};
alert(ss);

第一个显示“xiaoc”,证明调用了toString,而接着又弹出一个框显示“undefined”,是因为你的toString 没有返回值

如果:
var ss = { toString1: function() { alert("xiaoc"); }};
alert(ss);

这样是不会执行toString1 的,因为ss 是一个object 对象
所以弹出:[object Object]


如果:
var ss = { toString: function() { alert("xiaoc"); return 1;}};
alert(ss);

第一个显示“xiaoc",再弹出toString 的返回值 1
bhbhxy 2010-11-23
  • 打赏
  • 举报
回复
这个是w3c的解释

定义和用法
toString() 方法可把一个逻辑值转换为字符串,并返回结果。

如果重写了该方法,也需要返回值
hookee 2010-11-23
  • 打赏
  • 举报
回复
toString 要有返回值

<script>
function b(){
Number.prototype.toString = function() { alert("xiaod"); return this.valueOf() };
var ss = { toString: function() { alert("xiaoc"); return this.valueOf() } };
var f = new Number(33);
alert(f);
alert(ss);
}
window.onload = b;
</script>
bigcctv 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 babyboy9685 的回复:]
HTML code

<script>

function b() {
Number.prototype.toString = function() { alert("xiaod") };
var ss = { toString: function() { alert("xiaoc"); } };……
[/Quote]
谢谢你的回答~不是哦~var的那个f=33是当number看待的,你可以试试加个alert(typeof(f));,可以看到显示的是Number~~请指教!~~谢谢~~
bigcctv 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 babyboy9685 的回复:]
引用 7 楼 bigcctv 的回复:
哦哦~~谢谢楼上各位~~但是请问为什么第一个alert不自动调用toString,第二个alert自动调用toString呢?请指教!~谢谢~~

第一个 alert() 也是调用了toString的 只是他调用的那个不是ss定义的 而是f里定义的 进城定义的toString是有返回值的 返回了显示出的33 而第二个alert()调用ss的toStri……
[/Quote]
但是我一开始在前面重写了number的toString哦,如果第一个调用了toString的话,应该是会显示xiaod的
逍遥庄主 2010-11-23
  • 打赏
  • 举报
回复

<script>

function b() {
Number.prototype.toString = function() { alert("xiaod") };
var ss = { toString: function() { alert("xiaoc"); } };
var f = 33;
alert(f);
var n = new Number();
alert(n);
alert(ss);
}
window.onload = b;
</script>

再看看我这个代码 相信你能明白 你var的那个f=33 应该是当做string看待了 alert时 调用了string的toString() 而 var n = new Number(); alert(n)时就调用了你定义的toString() 同样没有返回值 第二次弹出undefined
逍遥庄主 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bigcctv 的回复:]
哦哦~~谢谢楼上各位~~但是请问为什么第一个alert不自动调用toString,第二个alert自动调用toString呢?请指教!~谢谢~~
[/Quote]
第一个 alert() 也是调用了toString的 只是他调用的那个不是ss定义的 而是f里定义的 进城定义的toString是有返回值的 返回了显示出的33 而第二个alert()调用ss的toString时执行了里边的alert(ciaoc),弹出一个值,但是他没有返回值 所以第二下没有接收到 是undefined 我是这样理解的 共同学习 请指正
bigcctv 2010-11-23
  • 打赏
  • 举报
回复
哦哦~~谢谢楼上各位~~但是请问为什么第一个alert不自动调用toString,第二个alert自动调用toString呢?请指教!~谢谢~~
一、prometheus简介 Prometheus是一个开源的系统监控和告警系统,现在已经加入到CNCF基金会,成为继k8s之后第二个在CNCF维护管理的项目,在kubernetes容器管理系统中,通常会搭配prometheus进行监控,prometheus支持多种exporter采集数据,还支持通过pushgateway进行数据上报,Prometheus再性能上可支撑上万台规模的集群。 二、prometheus架构图 三、prometheus组件介绍 1.Prometheus Server: 用于收集和存储时间序列数据。 2.Client Library: 客户端库,检测应用程序代码,当Prometheus抓取实例的HTTP端点时,客户端库会将所有跟踪的metrics指标的当前状态发送到prometheus server端。 3.Exporters: prometheus支持多种exporter,通过exporter可以采集metrics数据,然后发送到prometheus server端 4.Alertmanager: 从 Prometheus server 端接收到 alerts 后,会进行去重,分组,并路由到相应的接收方,发出报警,常见的接收方式有:电子邮件,微信,钉钉, slack等。 5.Grafana:监控仪表盘 6.pushgateway: 各个目标主机可上报数据到pushgatewy,然后prometheus server统一从pushgateway拉取数据。 四、课程亮点 五、效果图展示 六、讲师简介 先超(lucky):高级运维工程师、资深DevOps工程师,在互联网上市公司拥有多年一线运维经验,主导过亿级pv项目的架构设计和运维工作 主要研究方向: 1.云计算方向:容器 (kubernetes、docker),虚拟化(kvm、Vmware vSphere),微服务(istio),PaaS(openshift),IaaS(openstack)等2.系统/运维方向:linux系统下的常用组件(nginx,tomcat,elasticsearch,zookeeper,kafka等),DevOps(Jenkins+gitlab+sonarqube+nexus+k8s),CI/CD,监控(zabbix、prometheus、falcon)等 七、课程大纲

87,901

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧