繁体   English   中英

如何在 JavaScript 中引用原始类型?

[英]How can I reference a primitive type in JavaScript?

我想让这样的函数在 JavaScript 中按预期工作:

function isLastElem(array, elem) {
    if (elem === array[array.length-1]) {
        return true;
    }
    else {
        return false;
    }
}

目的是该函数应该能够识别任何数组的最后一个元素。 例如:

let arr = [0, 1, 2];
console.log(isLastElem(arr, 2)); // I would expect false to be returned
console.log(isLastElem(arr, arr[2])); // I would expect true to be returned

然而,由于数字是原始值,它们通过它们的值传递给函数,因此两个函数调用都返回 true。 有什么方法可以解决这个问题并通过引用传递数字?

这里的重要想法是让它在每个循环中都可用。 例如:

let arr = [0, 1, 0];
arr.forEach((elem) => {
    if (isLastElem(arr, elem)) {
        console.log("Found the last element!");
    }
});

在第一个 0 处,函数应该返回 false,因为那不是数组的最后一个元素。 然后在第二个 0 它应该返回 true 并记录消息。

您可以通过将您的数字包装在一个数组或对象中来做到这一点,就像这样:

let arr = [[0], [1], [2]];
console.log(isLastElem(arr, [2])); // returns false
console.log(isLastElem(arr, arr[2])); // returns true

尽管我很难想象为什么有人需要这样做,但我认为我们可以使用Symbol来完成这项工作:

Symbol() 返回的每个符号值都是唯一的。 符号值可以用作对象属性的标识符; 这是数据类型的唯一目的。

所以这意味着我们可以使用Symbol来标记数组的每个元素。 正如你所看到的,一个1的数组可以转换成一个1的符号数组,这些符号都是唯一的:

const xs = [1, 1];

xs[0] === xs[1];
//=> true

const ys = [Symbol(1), Symbol(1)];

ys[0] === ys[1];
//=> false

ys[0] === Symbol(1);
//=> false

ys[1] === ys[1];
//=> true

因此,要标识数组的最后一个元素,您实际上需要对该元素的引用:

 console.log( [1, 1, 1] // convert to list of symbols of 1 .map(Symbol) // check if current element is equal to the last element .map((x, _, xs) => x === xs[xs.length - 1]) ); //=> [false, false, true]


当然,问题在于它将每个元素都包裹在一个无法逃脱的盒子中。

我们可以将每个元素放在一个对象中,隐藏在“秘密唯一”键后面。 每个对象都有一个方法来提取它的值并将自己与其他类似的对象进行比较:

 const obj = (k, v) => ( { [k]: v , get: () => v , equals: o => o[k] === v }); const stamp = (arr, secret = Date.now()) => arr.map((x, i) => obj(`${secret}@@${i}`, x)); const arr = stamp([1, 1, 1]); arr.forEach((x, _, xs) => { console.log(x.get(), x.equals(xs[xs.length - 1])); });

您可能无法存储本地号码,而是存储 Number.. 的实例。

例如。

 function isLastElem(array, elem) { if (elem === array[array.length-1]) { return true; } else { return false; } } let arr = [new Number(0), new Number(1), new Number(2)]; console.log(isLastElem(arr, 2)); // I would expect false to be returned console.log(isLastElem(arr, arr[2])); // I would expect true to be returned

你可以试试这个代码


let arr = [0, 1, 2];
console.log(isPrimitive(arr[index+1]));

function isPrimitive(val) {
  return isString(val) || isBoolean(val) || (isNumber(val) && !isNaN(val));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM