老师,我这里换成判断string,然后push就会报length错,如果换成number,push就不报错,为什么呢

来源:3-14 代理Proxy(上)

灿烂__

2020-05-26

let arr2 = []
arr2 = new Proxy(arr2, {
    set(target, prop, val) {
        if (typeof val === 'string') { // number不报错
            target[prop] = val
            return true
        } else {
            return false
        }
    }
})
arr2.push("abc")
/** VM1553:1 Uncaught TypeError: 'set' on proxy: trap returned falsish for property 'length'
    at Proxy.push (<anonymous>)
    at <anonymous>:1:6
 **/
写回答

1回答

谢成

2020-05-26

这个问题在阮一峰老师的书里其实也提到过:https://es6.ruanyifeng.com/#docs/proxy

//img.mukewang.com/szimg/5ecd22d209cc99e914070909.jpg



我们再来看一下ecma的官方文档是怎么写的:http://www.ecma-international.org/ecma-262/6.0/#sec-proxy-object-internal-methods-and-internal-slots-set-p-v-receiver

//img.mukewang.com/szimg/5ecd230209e3b06016531032.jpg


所以我觉得,虽然说set方法需要返回一个布尔型的值,但经过测试发现应该是只能return true,如果return false就会报错,所以我觉得改成这样写可能会好一些:

//img.mukewang.com/szimg/5ecd23ac0964975b12330870.jpg

也就是当传入的参数不符合判断的时候,我们就抛出一个异常,这个异常其实只是告诉调用者参数传的不正确,也可以不抛出异常,因为else中没有赋值语句所以也就不会赋值成功。但整个还是得返回true。


1
0

JavaScript ES(6-11)全版本语法 前端都需要的基础课

前端无门槛学习,从ES6到ES11,一套课程掌握JS最新语法

1328 学习 · 296 问题

查看课程