Чому null
вважається анobject
JavaScript?
Перевірка
if ( object == null )
Do something
такий же як і
if ( !object )
Do something
?
А також:
У чому різниця між null
і undefined
?
Чому null
вважається анobject
JavaScript?
Перевірка
if ( object == null )
Do something
такий же як і
if ( !object )
Do something
?
А також:
У чому різниця між null
і undefined
?
Відповіді:
(name is undefined)
Ви: Що таке name
? (*)
JavaScript name
:? Що таке name
? Я не знаю, про що ти говориш. Ви ніколи раніше ні про кого не згадували name
. Чи бачите ви якусь іншу мову сценаріїв на стороні (клієнт)?
name = null;
Ви: Що таке name
?
JavaScript: Я не знаю.
Коротко; undefined
де немає поняття про річ; він не має типу, і ніколи раніше в цьому обсязі не посилалися;null
там, де річ, як відомо, існує, але невідомо, у чому цінність.
Одна річ , щоб пам'ятати, що null
це не так , концептуально, так само , як false
і ""
чи такий, навіть якщо вони прирівнюють після типу лиття, тобто
name = false;
Ви: Що таке name
?
JavaScript: Булева помилка.
name = '';
Ви: Що таке name
?
JavaScript: Порожній рядок
*: name
у цьому контексті мається на увазі як змінна, яка ніколи не була визначена. Це може бути будь-яка невизначена змінна, однак ім'я є властивістю майже будь-якого елемента форми HTML. Він іде шляхом, назад і був заведений задовго до ід. Це корисно, оскільки ідентифікатори повинні бути унікальними, але імена не повинні бути.
null
- "нічого". Нуль точно визначається як відсутність значення. Пустота, нуль, нада. Нічого.
name
" це правда. Однак оголошення про змінну без присвоєння їй значення ( var somevar;
), напрочуд, все одно призведе до undefined
.
Різницю можна підсумувати в цей фрагмент:
alert(typeof(null)); // object
alert(typeof(undefined)); // undefined
alert(null !== undefined) //true
alert(null == undefined) //true
Перевірка
object == null
інша перевірка if ( !object )
.
Останній дорівнює ! Boolean(object)
, тому що одинарний!
оператор автоматично передає правильний операнд в булевий.
Так як Boolean(null)
дорівнює хибність !false === true
.
Отже, якщо ваш об’єкт недійсний , але неправдивий або 0 або "" , перевірка пройде, оскільки:
alert(Boolean(null)) //false
alert(Boolean(0)) //false
alert(Boolean("")) //false
String(null)
побачити інший приклад кастингу. Ви навіть можете робити такі дурні речі, як Number(null + 2)
... але не варто :-). Відмінна відповідь від кентароміури.
typeof
, це оператор. Ви б не загорнули операнда в дужки з тієї ж причини, яку не написали б var sum = 1 +(1);
.
null
це не є об'єктом , це елементарне значення . Наприклад, ви не можете додати в нього властивості. Іноді люди неправильно припускають, що це об’єкт, тому що typeof null
повертається "object"
. Але це насправді помилка (яка може бути навіть виправлена в ECMAScript 6).
Різниця між null
та undefined
полягає в наступному:
undefined
: використовується JavaScript та означає "немає значення". Неініціалізовані змінні, відсутні параметри та невідомі змінні мають це значення.
> var noValueYet;
> console.log(noValueYet);
undefined
> function foo(x) { console.log(x) }
> foo()
undefined
> var obj = {};
> console.log(obj.unknownProperty)
undefined
Однак доступ до невідомих змінних створює виняток:
> unknownVariable
ReferenceError: unknownVariable is not defined
null
: використовується програмістами для позначення "немає значення", наприклад, як параметр функції.
Вивчення змінної:
console.log(typeof unknownVariable === "undefined"); // true
var foo;
console.log(typeof foo === "undefined"); // true
console.log(foo === undefined); // true
var bar = null;
console.log(bar === null); // true
Як правило, у JavaScript завжди слід використовувати === і ніколи == (== виконує всі види перетворень, які можуть призвести до несподіваних результатів). Перевірка x == null
являє собою крайній випадок, тому що він працює для обох null
і undefined
:
> null == null
true
> undefined == null
true
Поширений спосіб перевірити, чи має змінна значення, - це перетворити її на булеву і подивитися, чи є вона true
. Це перетворення виконується if
оператором і булевим оператором! ("Ні").
function foo(param) {
if (param) {
// ...
}
}
function foo(param) {
if (! param) param = "abc";
}
function foo(param) {
// || returns first operand that can't be converted to false
param = param || "abc";
}
Недолік такого підходу: усі наведені нижче значення оцінюються false
, тому ви повинні бути обережними (наприклад, вищеперелічені перевірки не можуть розрізняти undefined
і 0
).
undefined
, null
false
+0
, -0
,NaN
""
Ви можете перевірити перетворення на булевий, використовуючи Boolean
як функцію (зазвичай це конструктор, який слід використовувати new
):
> Boolean(null)
false
> Boolean("")
false
> Boolean(3-3)
false
> Boolean({})
true
> Boolean([])
true
+0
і -0
окремо, якщо +0 === -0
?
+0
і -0
: 1/+0 !== 1/-0
.
Яка різниця між нульовим та невизначеним ??
Властивість, коли вона не має визначення, не визначена. null - об’єкт. Його тип - об’єкт. null - це особливе значення, що означає "немає значення. undefined не є об'єктом, його тип не визначений.
Ви можете оголосити змінну, встановити її на нуль, а поведінка ідентична, за винятком того, що ви побачите "null", роздруковані проти "undefined". Можна навіть порівняти змінну, яка не визначена з нульовою, або навпаки, і умова буде вірною:
undefined == null
null == undefined
Детальнішу інформацію див. У JavaScript Різниця між null та undefined .
і з новою редакцією так
if (object == null) does mean the same if(!object)
при тестуванні, якщо об'єкт неправдивий, вони обидва відповідають умові при тестуванні, якщо неправдивим , але не істинним
Перевірте тут: JavaScript gotcha
null
не є об’єктом. Це typeof null == 'object';
повертає справжнє через помилку, яку неможливо виправити в JavaScript (зараз, але може змінитися в майбутньому).
Перша частина питання:
Чому null вважається об’єктом у JavaScript?
Це помилка дизайну JavaScript, яку вони зараз не можуть виправити. Це повинен був бути тип null, а не type або взагалі не мати його. Це вимагає додаткової перевірки (іноді забутої) при виявленні реальних об'єктів і є джерелом помилок.
Друга частина питання:
Перевіряє
if (object == null)
Do something
те саме, що
if (!object)
Do something
Два чеки завжди обидва помилкові, за винятком:
об'єкт не визначений або нульовий: і те й інше.
об'єкт примітивний, а 0, ""
або хибний: перший перевірити хибність, другий істинно.
Якщо об'єкт не є примітивним, а реальний об'єкт, як new Number(0)
, new String("")
або new Boolean(false)
, то обидві перевірки є помилковими.
Отже, якщо "об'єкт" інтерпретується як "реальний об'єкт", то обидві перевірки завжди однакові. Якщо примітиви дозволені, то перевірки відрізняються за значеннями 0 ""
, та false.
У таких випадках, як object==null
непомітні результати можуть бути джерелом помилок. Використання ==
не рекомендується ніколи, ===
а замість цього.
Третя частина питання:
А також:
Яка різниця між нульовим та невизначеним?
У JavaScript одна відмінність полягає в тому, що null має тип об'єкта, а undefined - тип undefined.
У JavaScript null==undefined
є істинним і вважається рівним, якщо тип ігнорується. Чому вони вирішили це, але 0 ""
і false не рівні, я не знаю. Здається, це довільна думка.
У JavaScript null===undefined
не відповідає дійсності, оскільки тип повинен бути однаковим у ===
.
Насправді нульові та невизначені тотожні, оскільки вони обидва представляють неіснування. Тож зробіть 0, і ""
в цьому питанні теж, а може бути і порожні контейнери []
і {}
. Так багато типів того ж нічого не є рецептом помилок. Один тип або взагалі жоден не кращий. Я б намагався використовувати якомога менше.
'false', 'true' і '!' - це ще один мішок з глистами, який можна спростити, наприклад, if(!x)
таif(x)
лише вона є достатньою, вам не потрібні справжні та неправдиві.
Оголошений var x
тип не визначений, якщо значення не задано, але воно повинно бути таким же, як якщо б x ніколи не було оголошено. Ще одне джерело помилок - порожній контейнер нічого. Тому найкраще декларувати та визначати це разом, як var x=1
.
Люди кружляють по колах, намагаючись з'ясувати всі ці різні види нічого, але це все одне і те саме в складному різному одязі. Реальність така
undefined===undeclared===null===0===""===[]==={}===nothing
І, можливо, всі повинні кинути винятки.
[]
зрозуміло, має .push()
функцію , тому немає жодного хорошого аргументу, щоб [] був нульовим. 0,02 дол.
Один із способів зробити сенс нульовим та невизначеним - зрозуміти, де відбувається кожне.
Очікуйте нульове значення повернення в наступних ситуаціях:
Методи, що запитують DOM
console.log(window.document.getElementById("nonExistentElement"));
//Prints: null
Відповіді JSON, отримані на запит Ajax
{
name: "Bob",
address: null
}
Нова функціональність, яка знаходиться в потоці. Наступні повертаються нульовими:
var proto = Object.getPrototypeOf(Object.getPrototypeOf({}));
// But this returns undefined:
Object.getOwnPropertyDescriptor({}, "a");
Усі інші випадки відсутності позначаються невизначеними (як зазначає @Axel). Кожен із наступних відбитків "невизначений":
var uninitalised;
console.log(uninitalised);
var obj = {};
console.log(obj.nonExistent);
function missingParam(missing){
console.log(missing);
}
missingParam();
var arr = [];
console.log(arr.pop());
Звичайно, якщо ви вирішили написати var unitialised = null; або повернути null з методу самостійно, тоді ви матимете null в інших ситуаціях. Але це має бути досить очевидним.
Третій випадок - це коли ви хочете отримати доступ до змінної, але навіть не знаєте, чи вона була оголошена. У цьому випадку використовуйте typeof, щоб уникнути помилки посилання:
if(typeof unknown !== "undefined"){
//use unknown
}
Підсумково перевіряйте наявність нуля, коли ви маніпулюєте DOM, маючи справу з Ajax або використовуючи певні функції ECMAScript 5. Для всіх інших випадків безпечно перевірити, чи не визначено сувору рівність:
if(value === undefined){
// stuff
}
Порівняння багатьох різних нульових перевірок у JavaScript:
http://jsfiddle.net/aaronhoffman/DdRHB/5/
// Variables to test
var myNull = null;
var myObject = {};
var myStringEmpty = "";
var myStringWhiteSpace = " ";
var myStringHello = "hello";
var myIntZero = 0;
var myIntOne = 1;
var myBoolTrue = true;
var myBoolFalse = false;
var myUndefined;
...trim...
http://aaron-hoffman.blogspot.com/2013/04/javascript-null-checking-undefined-and.html
null та undefined - обидва помилкові для значення рівності (null == undefined): вони обоє згортаються до булевих false. Вони не є одним і тим же об'єктом (null! == undefined).
undefined - властивість глобального об'єкта ("вікно" у браузерах), але є примітивним типом, а не самим об'єктом. Це значення за замовчуванням для неініціалізованих змінних та функцій, що закінчуються без оператора return.
null - це примірник Object. null використовується для методів DOM, які повертають об'єкти колекції для вказівки порожнього результату, який надає помилкове значення без вказівки на помилку.
Деякі заходи:
null та undefined - це два різних значення. Один представляє відсутність значення для імені, а інший - відсутність імені.
Що відбувається в if
анкеті if( o )
:
Вираження в круглих дужках о оцінюється, а потім if
натискання клавіш у типовому примушуванні значення виразу в дужках - у нашому випадку o
.
Значення Falsy (які будуть примусові до помилкових) у JavaScript мають значення: '', null, undefined, 0 і false .
Щоб додати відповідь на те, у чому різниця між undefined
таnull
, з JavaScript Definitive Guide 6th Edition, стор.41 на цій сторінці :
Ви можете розглянути
undefined
можливість відображення системного, несподіваного або помилковогоnull
відсутності значення та представити програмний рівень, нормальну чи очікувану відсутність значення. Якщо вам потрібно призначити одне з цих значень змінній чи властивості або передати одне з цих значень функції,null
майже завжди це правильний вибір.
null
є об’єктом. Його тип недійсний. undefined
не є об’єктом; її тип не визначений.
null
і undefined
первісні значення - typeof null === 'object'
це мовна помилка, тому щоObject(null) !== null
Наступна функція показує, чому і здатна розробити різницю:
function test() {
var myObj = {};
console.log(myObj.myProperty);
myObj.myProperty = null;
console.log(myObj.myProperty);
}
Якщо ви телефонуєте
test();
Ви отримуєте
невизначений
нуль
Перші console.log(...)
спроби отримати myProperty
від myObj
поки він ще не визначений - тому він отримує назад «невизначені». Після присвоєння йому null, другий console.log(...)
повертається, очевидно, "null", оскільки myProperty
існує, але має значенняnull
присвоєне йому значення.
Для того , щоб мати можливість запросити цю різницю, JavaScript має null
і undefined
: В той час як null
це - так само , як і на інших мовах об'єкт, undefined
не може бути об'єктом , тому що немає ні одного випадку (навіть не null
примірник) доступний.
Наприклад window.someWeirdProperty
, невизначений, так
"window.someWeirdProperty === null"
оцінює помилковий час
"window.someWeirdProperty === undefined"
оцінює до істинного.
Більш того, чекіф if (!o)
- це не те саме, що перевірка if (o == null)
на o
наявність false
.
Інша прикольна річ про null, порівняно з невизначеною, - це те, що вона може збільшуватися.
x = undefined
x++
y = null
y++
console.log(x) // NaN
console.log(y) // 0
Це корисно для встановлення цифрових значень за замовчуванням для лічильників. Скільки разів ви встановили змінну до -1 у своїй декларації?
Подивись на це:
<script>
function f(a){
alert(typeof(a));
if (a==null) alert('null');
a?alert(true):alert(false);
}
</script>
//return:
<button onclick="f()">nothing</button> //undefined null false
<button onclick="f(null)">null</button> //object null false
<button onclick="f('')">empty</button> //string false
<button onclick="f(0)">zero</button> //number false
<button onclick="f(1)">int</button> //number true
<button onclick="f('x')">str</button> //string true
З "Принципи об'єктно-орієнтованого Javascript" Ніколаса Закаса
Але чому об’єкт, коли тип недійсний? (Насправді це було визнано помилкою TC39, комітетом, який розробляє та підтримує JavaScript. Ви можете пояснити, що null є порожнім вказівником об'єкта, що робить "об'єкт" логічним повернутим значенням, але це все ще заплутано.)
Закас, Микола К. (2014-02-07). Принципи об'єктно-орієнтованого JavaScript (Kindle Locations 226-227). Немає крохмальної преси. Kindle видання.
Це сказав:
var game = null; //typeof(game) is "object"
game.score = 100;//null is not an object, what the heck!?
game instanceof Object; //false, so it's not an instance but it's type is object
//let's make this primitive variable an object;
game = {};
typeof(game);//it is an object
game instanceof Object; //true, yay!!!
game.score = 100;
Невизначений випадок:
var score; //at this point 'score' is undefined
typeof(score); //'undefined'
var score.player = "felix"; //'undefined' is not an object
score instanceof Object; //false, oh I already knew that.
Найкращий спосіб подумати над «null» - згадати, як подібне поняття використовується в базах даних, де це вказує на те, що поле не містить «значення взагалі».
Це дуже корисна техніка для написання програм, які легше налагоджуються. Невизначена змінна може бути результатом помилки ... (як би ви знали?) ... але якщо змінна містить значення "null", ви знаєте, що "хтось десь у цій програмі встановив її на 'null.' "Тому я пропоную, коли вам потрібно позбутися значення змінної, не" delete "... встановіть її на" null. " Стара цінність осиротить і незабаром буде зібрана сміття; нове значення - "немає значення (зараз)". В обох випадках стан змінної є певним: "це, очевидно, свідомо, саме таким чином".
2.Undefined - це сам тип, а Null - об’єкт.
3.Javascript може сам ініціалізувати будь-яку непризначену змінну до невизначеної, але вона ніколи не може встановлювати значення змінної до null. Це потрібно робити програмно.