JS重写函数valueOf方法实现连续调用求和

来源:互联网 发布:淘宝怎么利用微淘推广 编辑:程序博客网 时间:2024/06/04 23:20

对象转原始值先toString再valueOf

var obj = {    toString: function() {        console.log('调用了 obj.toString');        return {};    },    valueOf: function() {        console.log('调用了 obj.valueOf')        return '110';    }}alert(obj);// 调用了 obj.toString// 调用了 obj.valueOf// 弹出110

从上面代码可看出输出obj时,先调用其toString方法,若toString返回原始值就直接返回,否则继续调用valueOf方法。

var obj = {    toString: function() {        console.log('调用了 obj.toString');        return {};    },    valueOf: function() {        console.log('调用了 obj.valueOf')        return {};    }}alert(obj);// 调用了 obj.toString// 调用了 obj.valueOf// Uncaught TypeError: Cannot convert object to primitive value

若toString和valueOf都返回对象则程序报错

对象与数值运算转原始值先valueOf再toString

var obj = {    valueOf: function() {        console.log('调用 valueOf');        return 5;    }}console.log(obj + 1);// 调用 valueOf// 6var obj = {    valueOf: function() {        console.log('调用 valueOf');        return {};    },    toString: function() {        console.log('调用 toString');        return 10;    }}console.log(obj + 1);// 调用 valueOf// 调用 toString// 11var obj = {    valueOf: function() {        console.log('调用 valueOf');        return {};    },    toString: function() {        console.log('调用 toString');        return {};    }}console.log(obj + 1);// 调用 valueOf// 调用 toString// Uncaught TypeError: Cannot convert object to primitive value

输出函数名先valueOf,再toString

function test() {    var a = 1;    console.log(1);}test;// 这里打印函数内容,即调用了test.valueOf()test.valueOf = function() {    console.log('调用 valueOf 方法');    return 2;} test;// 输出如下:// 调用 valueOf 方法// 2

添加toString方法并将valueOf返回对象

test.valueOf = function() {    console.log('调用 valueOf 方法');    return {};}test.toString= function() {    console.log('调用 toString 方法');    return 3;}test;// 输出如下:// 调用 valueOf 方法// 调用 toString 方法// 3

若将其valueOf和toString都返回对象,程序不会报错

test.valueOf = function() {    console.log('调用 valueOf 方法');    return {};}test.toString= function() {    console.log('调用 toString 方法');    return {};}test;//调用 valueOf 方法//调用 toString 方法//ƒ #<Function>

题目

add(1)(2) // 3add(1, 2, 3)(10) // 16add(1)(2)(3)(4)(5) // 15

实现:

function add() {    var args1 = Array.prototype.slice.call(arguments);    var fn = function () {        var args2 = Array.prototype.slice.call(arguments);        return add.apply(null,args2.concat(args1));    };    fn.toString = function () {      return  args1.reduce(function (a, b) {            return a * b;        });    };   <!-- fn.valueOf = function () {        return  args1.reduce(function (a, b) {            return a + b;        });    };-->    return fn;}

其中,valueOf和toString,哪个先被改写优先调用谁,同时出现,调用valueOf

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 腰压迫的腿疼怎么办 肩胛提肌固定不住怎么办 胳膊粗后背肉多怎么办 2岁儿童 肋骨边缘外翻怎么办 5岁宝宝盆骨前倾怎么办 脖子弯了像驼背怎么办 都40周了还没生怎么办 股骨头坏死骨盆歪了怎么办 二胎侧切伤口疼怎么办 小月子盆骨酸痛怎么办 盆骨一边大一边小怎么办 快生了宫颈管长怎么办 想顺产 宫颈管长怎么办 腰和跨一样宽怎么办 脚后跟骨折手术后小腿变细怎么办 生完孩子骨盆错位怎么办 皮肤又黑又粗糙怎么办 翠研珠宝被坑了怎么办 领导是小人我该怎么办 微信二维码重置了怎么办 衣服有蝽的卵怎么办 人坐牢去了房贷怎么办 人死了欠的房贷怎么办 体育生文化没过怎么办 舍友偷了钱没证据怎么办 舍友要一直开空调怎么办 和大学室友相处不愉快怎么办 和舍友三观不合怎么办 室友欠200钱忘了怎么办 和舍友闹矛盾了怎么办 被宿舍人孤立了怎么办 分到一个爱管事的舍友怎么办 添加了村人名录怎么办 打csgo出现卡顿怎么办 csgo创意工坊下载慢怎么办 电脑全是英文死机了怎么办 亿盛国际出金后不到账怎么办 玩游戏的界面很大怎么办电脑 文件缺失导致电脑无法启动怎么办 眼睛里拉出白丝怎么办 脚扭了脚面肿了怎么办