2012-03-13 2 views
18

자바 스크립트 개체를지도로 사용할 수 있습니다. ... 잘못된null이 유효한 자바 스크립트 속성 이름입니까?

var x = {}; 
x.a = 1; 
x['b'] = 2; // the same as x.b = 2; 
x[3] = 3; // x.3 won't work, but this syntax works fine. Also, x[3] == x['3']. 
x['What, this works too?!?!?'] = 'Yup, it does!'; 

하지만 오늘은 ... 작동하는 것 같다 다른 경우를 테스트하지만보기 때문에 내 머리에 약간의 경고 플래그를 제기 : 모든 다음은 유효한 코드

x[null] = 42; 

예상대로 작동하면 매우 멋지 겠지요. (나는 많은 코드를 다시 작성할 필요가 없을 것입니다.) 그러나 나는 그것에 의존 할 수 있습니까? 아니면 그냥 이 모든 최신 브라우저에서 작동하려면이 발생하지만 Google 크롬의 다음 버전에서 작업을 중단 할 수있는 문서화되지 않은 동작일까요?

+1

인덱싱 인수는 작업이 수행되기 전에 문자열로 변환됩니다. 마지막 할당 후에'console.log (x [ "null"])'를 시도해보십시오. 당신은'3 '이라는 하위 스크립트를 다룰 때 그것을 보았습니다. –

+1

재미있게 :'x [x] = 1'은 기술적으로'x [ '[object Object]']'와'x [{}] '와 같은 값으로 색인됩니다. 그리고 당신이 다른 사람들을 싫어한다면 : x [x [x]] = 2'. – Deestan

답변

17

건은 문자열로 변환됩니다. null은 유효한 속성 인 "null"이됩니다. 내가 대답을 만든 그래서 내가 덧글을 남길 수 없습니다

+0

조지, 네가 맞아! 좋아, 나를 위해 일한다! :) –

+1

@ Vilx-PS. JSON.stringify (d)는'{ "[object Object]": ""}'와'var x = {};를 보여줍니다. x [{toString : function() {return 123}}] = 1; Object.keys (x)'는'123'을 포함합니다. –

+0

또한 null이 문자열 표현을 갖는 이유에 대한 자세한 설명은 http://stackoverflow.com/a/10362142를 참조하십시오. – bebbi

0
x['null'] = 42; 

혼란을 피하기 위해 강력히 권장하지 않습니다.

속성 이름은 문자열입니다. 예약 된 식별자를 나타내는 모든 문자열이 작동합니다. (객체의 toString() 메서드를 호출하여) 문자열이 문자열로 변환됩니다 아니다

모든 : 부동산 괄호 사이

a = ['FOO']; // an array 
o = {};  // an object 
o[a] = 'foo'; // using a as the property name 

// o now is: 
{ 
    FOO: 'foo' 
} 
+0

필자의 경우 인덱스는 하나의 특별한 "null"인덱스를 제외하고 숫자입니다. 나는 그것이 혼란을 일으킬 것이라고 생각하지 않는다. –

+0

음,'undefined'를 다시 정의하는 것처럼 냄새가납니다. 숫자 인덱스는 stings으로 변환됩니다. – Tomalak

+0

흠? 나는 아무것도 재정의하지 않을거야. 그것은 마치 ... 많은 데이터 객체들이 있고 그것들을 그들의 속성 중 하나 (그 속성은 실제로 DB의 숫자 ID 임)로 그룹화해야합니다. 오늘 나는 다른 데이터 소스의 데이터를 통합해야하는 상황을 보았지만 해당 소스에서 오는 데이터 객체에는이 속성의 ID가 포함되어 있지 않습니다. 그들은 원래의 물건들이 만드는 어떤 그룹에도 속하지 않고 오히려 그들 모두에게 속합니다. 그래서 그 객체를 표시하는 특별한 값이 필요합니다. 그리고 null은 좋은 적합으로 보입니다. –

-1

...

롭 W 그의 대답은 정확하지만 조금 잘못된 것입니다. 대괄호 사이의 항목은 ToString()을 사용하여 문자열로 변환됩니다. 따라서, A [null가]은 동일 A [ '널'] ToString (널) 예를 들어 == '널 (null)'

걸릴

var a = 1; 
var x = {} 

x[a] = 20; 
x['1'] = 30; -- this is exactly the same as the previous line and now x[a] == 30 
1

이 유효 인 ECMAScript 5,하지만 당신은 문제로 실행 할 수 있기 때문에 Internet Explorer의 일부 버전.

모든 괜찮 :

x.null 
// Error: Expected identifier 

x = {null: 42} 
// Expected identifier, string or number 

(크롬 위의 작업 모두, 심지어와 :

x = {}; 
x[null] = 42; 
x[null]; 
// 42 

x = {"null": 42}; 
x[null]; 
// 42 

그러나, IE8은 예약 등 null 같은 단어 다음에 동의하지 않습니다 "use strict" 사용)

0

환경이 ES6을 지원하고 null의 값을 저장할 수 있어야하는 경우 임의의 문자열뿐만 아니라 Map을 사용할 수 있습니다.

const a = new Map(); 

a.set(null, 'foo') 
a.set('null', 'bar') 

// Map { null => 'foo', 'null' => 'bar' } 
관련 문제