确定哪些对象在JavaScript 中是复杂的,并确定哪些对象是数组有一些hacky解决方案.幸运的是,它设法在以下两种情况下工作:
Object.prototype.toString.call([]); // [object Array]
Object.prototype.toString.call(new Array()); // [object Array]
Run Code Online (Sandbox Code Playgroud)
很棒,没有[object Object]在视线中!可悲的是,这种方法仍然设法失败:
var arr = Object.create(Array.prototype);
Object.prototype.toString.call(arr); // [object Object]
Run Code Online (Sandbox Code Playgroud)
这是令人沮丧的,所以至少可以这么说.我的arr对象具有数组的所有方法,它的功能类似于数组,并且出于所有目的,它是一个数组.然而,JavaScript并没有提供识别它的工具.
有没有办法弄清楚一个对象是否继承了特定的原型?我想你可以像这样迭代原型:
function inherits(obj, proto) {
while (obj != null) {
if (obj == proto) return true;
obj = Object.getPrototypeOf(obj);
}
return false;
}
inherits(Object.create(Array.prototype), Array.prototype); // true
Run Code Online (Sandbox Code Playgroud)
但感觉有点黑客.有没有更清洁的方法?
我的javascript对象看起来像:
$scope.display = {
current: {
key1: 'value1',
key2: ['a', 'b'],
key3: 'value2'
}
}
Run Code Online (Sandbox Code Playgroud)
在我的代码中的一些事件,我想将这些值重置为undefined,如下所示:
$scope.display = {
current: {
key1: undefined,
key2: [],
key3: undefined
}
}
Run Code Online (Sandbox Code Playgroud)
我使用像lodash这样的库,但是我没有看到任何可以执行此操作的函数.我知道如何手动执行此操作,但我想知道是否有"最佳实践"方法来执行此任务.
我需要知道如何检查变量是数组还是对象
var arr = ['foo', 'bar'];
var obj = {
0: 'foo',
1: 'bar'
}
document.write('arr is an: ' + typeof arr + ', obj is an: ' + typeof obj)
// The result is always:
// arr is an: object, obj is an: object
Run Code Online (Sandbox Code Playgroud)
有什么办法可以区分这两种类型吗?
我正在查看代码,以确定对象是否是一个数组,我发现了这个答案.
代码工作正常,但我无法理解它是如何进行比较的 [object Array]
我试图得到它typeof Array,但这是一个错误.所以我对这段代码感到困惑"
if( Object.prototype.toString.call( someVar ) === '[object Array]' ) {
Run Code Online (Sandbox Code Playgroud)
我很想知道toString.call( _ON_AN_ARRAY_ )对Object 的方法调用是如何正确获取Array对象的类型的.
我遇到了处理原型方法消失(在本例中为 Array.prototype 方法)的问题,仅在 IE 中且仅当数组通过 SignalR 时。
我写了一个小/愚蠢但简单的概念验证网络应用程序来演示这个问题(代码如下)。请注意,当您单击“更新所有客户端”,然后单击“包含字母 'r' 的水果”时,_list 中的原型方法丢失导致异常。在那种情况下,数组来自 SignalR。现在,当您单击“重置”并将数组重置为硬编码值时,“包含字母 'r' 的水果”按钮突然起作用了 - 原型方法又回来了。请记住,此问题仅发生在 IE 中。
提示:当我第一次编写概念证明时,我无法重现该问题。当数组通过 SignalR 传入时,IE 仍然具有原型方法,但是在加载页面时我确实遇到了另一个错误。我不小心包含了两次 jQuery。当我取出多余的脚本以包含第二个 jQuery 时,它修复了该错误(显然),但现在可以重现该问题。然后 IE 缺少我创建的 Array 原型方法,但仅当数组通过 SignalR 出现时。
myExtensions.js:
Array.prototype.where = function (del)
{
var ret = new Array();
for (var i = 0; i < this.length; i++)
{
if (del(this[i])) ret.push(this[i]);
}
return ret;
}
Array.prototype.select = function (del)
{
var ret = new Array();
for (var i = 0; i < this.length; i++)
{
ret.push(del(this[i])); …Run Code Online (Sandbox Code Playgroud) 我有一个动态的json对象,它可以在内部包含不同类型的属性和对象,甚至可以包含平面字符串甚至数组。我制作了一个JavaScript代码,将单个JSON结构转换为HTML表,效果很好,但id希望将其用于动态JSON,因此基本上,我需要遍历JSON树的父级和子级,以了解如何创建此结构HTML表格。
但是在尝试验证孩子是否有对象时确实存在一些问题,例如:(我不想在JSON中添加很多细节)
parent: {
child_1: {
attr1 : value1
},
child_2: {
[{ attribues and values in an array }]
}
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?我当时正在考虑像这样使用“ typeof”函数:
if (typeof key === 'array') {
// do something
}else{
// do another stuff
}
Run Code Online (Sandbox Code Playgroud)
但是我不相信它会很好,你们能帮我吗?
提前致谢。
x 是一个数组。
我console.log(x)知道了
[ 'value' ]
Run Code Online (Sandbox Code Playgroud)
但是当我检查x的类型console.log(typeof x)时说它是一个对象。为什么?
是否有一个特定的原因,为什么我看到很多人写作
if(1 === a) {...}
Run Code Online (Sandbox Code Playgroud)
代替
if(a === 1) {...}
Run Code Online (Sandbox Code Playgroud)
我给出了一个答案,其中我写了一些类似的东西Array === obj.constructor,当有人问我他经常看到人们这样写而不是obj.constructor === Array.
那么我使用哪种方式真的很重要?
我只是在这段代码上扯掉我的头发!我必须遗漏一些明显的东西。我声明了一个数组,它的类型返回“对象!”
代码如下:
var markers = new Array();
console.log(typeof markers);
d3.json(queryUrl, function(data) {
console.log(data.features)
data.features.forEach( function(each) {
let ball = each["geometry"]["coordinates"]
console.log(typeof markers)
markers.push(
L.marker([ball[1], ball[0]])
.bindPopup(`Magnitude: ${each["properties"]["mag"]}`);
)
});
});
markers = L.layerGroup(markers);
Run Code Online (Sandbox Code Playgroud)
在两者中console.log(typeof),它们都返回对象,并且该markers.push()行引发错误(这是首先提示检查类型的原因)
我的第一个下意识反应是最后一行是罪魁祸首,但我将第一行改为var test = new Array();,它做了同样的事情
obj.constructor === Array用于测试对象是否为此处建议的数组是否正确?是否总能返回与之兼容的正确答案Array.isArray?
javascript ×9
arrays ×3
prototype ×2
types ×2
call ×1
comparison ×1
d3.js ×1
ecmascript-5 ×1
html ×1
jquery ×1
json ×1
leaflet ×1
lodash ×1
object ×1
performance ×1
signalr ×1