01/10/2018, 16:39

Javascript có biến name rất lạ

Các bác xem ảnh nhé. Javascript này nó có vấn đề gì với cái biến name hả các bác :)))))

Kamui Ka viết 18:54 ngày 01/10/2018
console.log(typeof name)
string

console.log(typeof tenKhac)
object

thế này chắc bạn hiểu rồi chứ

*grab popcorn* viết 18:41 ngày 01/10/2018

window.name = tên của cửa sổ hiện tại

Bạn gõ name = xyz tức = window.name = xyz

kid1412 viết 18:41 ngày 01/10/2018

Do đối tượng window đã có sẵn thuộc tính name là string rồi, khi bạn gán giá trị thì nó tự nhận giá trị toString luôn. Thử:

var name =  ["Một", "Hai", "Ba", "Bốn"];
var status = ["Một", "Hai", "Ba", "Bốn"];
console.log(name, status);
Nguyễn Đức Hoàng viết 18:53 ngày 01/10/2018

console.log(name, status);

Viết kiểu này có nghĩa là convert type của status thành type của name hả bạn.

kid1412 viết 18:45 ngày 01/10/2018

Chỉ là hiển thị biến ra console thôi, bạn hiển thị nhiều biến thì cách bởi dấu ,
console.log(var1, var2, var3)
console.log(...args)

Nguyễn Đức Hoàng viết 18:42 ngày 01/10/2018

“name” có được coi là 1 từ khóa không bạn nhỉ. Mình đã khai báo lại biến name rồi mà.

Hung viết 18:52 ngày 01/10/2018
otherWindow = {};
otherWindow.window = otherWindow;

Object.defineProperty(otherWindow, 'name', {
    set: function (val) {
        otherWindow._name = String(val);
        return otherWindow._name;
    },
    get: function () {
		return otherWindow._name;
    }
});

otherWindow.name = ['one', 'two'];

console.log('Name:', otherWindow.name);
console.log('Name type: ', typeof otherWindow.name);

Output

Name: one,two
Name type: string
*grab popcorn* viết 18:42 ngày 01/10/2018

Name không phải là 1 từ khóa. Mà 1 biến browser dùng rồi thôi.
Để sửa bạn chỉ cần dùng let hoặc const thay cho var là được.

Trần Hoàn viết 18:53 ngày 01/10/2018

Nói cách khác: vấn đề không phải là do JavaScript mà là do browser đã có một con trỏ là name rồi.
Mình đang dùng cocos2d-x js để build apk và không có vấn đề gì với name cả.

null viết 18:55 ngày 01/10/2018

Tìm hiểu thêm reserved words và web api. Mà tránh dùng các biến đấy chứ đừng có sửa, ghi đè lên, window.name này thường dùng trong popup. Nếu làm dự án lớn thì đây có thể tính là hành vi bóp team kinh điển đấy.
Ngoài lề tí, mình từng gặp trang vns.site ghi đè lên window.URL thành cái page url. Trong khi URL là web api, có method để tạo blob url, làm lỗi mất script của mình.

明玉 viết 18:46 ngày 01/10/2018

có vẻ name đã là 1 global var, nhưng hay ở chỗ lại không thể dùng var name để tạm thế chỗ nó được. JS Engine lắm cái quái dị.

Nguyen Ca viết 18:55 ngày 01/10/2018
null === null  ?
undefined === undefined  ?
undefined === null ?  
undefined == null ?
a = []
b = 0
a==b = ?   

đoán kết quả xem :v

Hung viết 18:50 ngày 01/10/2018

null có kiểu là Null
undefined có kiểu là Undefined
Kiểu Null và kiểu Undefined đều là primitive type
Nên trong strictly equal operator (không có ép kiểu) khi so sánh 2 value kiểu null và undefined so sánh giá trị với nhau.

null === null // true
undefined === undefined // true
null === undefined // false - Null type != Undefined type

Hai luật đầu tiên của A == B nếu A và B khác type.

  • Nếu kiểu của A là Undefined, kiểu của B là Null, kết quả là true
  • Nếu kiểu của A là Null, kiểu của B là Undefined, kết quả là true
undefined == null // true

Hai luật tiếp theo được áp dụng của ==

  • Nếu kiểu của A là String hoặc Number, B là object type, kết quả cuối cùng là kết quả của A == [[ToPrimitive]](B)
  • Nếu kiểu của A là object type, B là String hoặc Number, kết quả cuối cùng là kết quả của [[ToPrimitive]](A) == B
a = []
b = 0
a == b

Tương đương

[] = 0

Bên trái là object type, bên phải là Number thuộc primitive type, luật chuyển về primitive type được áp dụng lên []. Trong ToPrimitive, gọi [].valueOf(), theo prototype chain, gọi đến Object.prototype.valueOf(), trả về chính nó, là []

Object.prototype.valueOf = function () {
  return this;
};

Cũng trong ToPrimitive, gọi tiếp [[ToString]] lên giá trị trả về của valueOf(), ToString lấy kết quả của hàm toString() của [] [].toString() trả về chuỗi rỗng (empty string) “”. Sau bước này, == chuyển thành

"" == 0

2 luật tiếp nữa của == được áp dụng:

  • Nếu A là Number và B là String, kết quả là kết quả của A == ToNumber(B)
  • Nếu A là String và B là Number, kết quả là kết quả của ToNumber(A) == B

ToNumber có tham số là empty string “” và trả về giá trị 0.

Toàn bộ quá trình chuyển đổi.

[] == 0
"" == 0
 0 == 0 // true

Sẵn mình ôn bài luôn

Nguyen Ca viết 18:56 ngày 01/10/2018

Bác biết nhiều nhỉ từ js đên jav -.-, bác đi làm mấy năm rồi?

Hung viết 18:49 ngày 01/10/2018

Không có đâu anh, em chỉ ham hố thấy câu nào hay hay, đi search trên Google, tổng hợp lại rồi trả lời thôi. Kinh nghiệm chắc không quá 2 năm.

Nguyen Ca viết 18:53 ngày 01/10/2018

Vậy là quá giỏi :D,
Nghiên cứu kỹ thế này sẽ tiến xa lắm đây…

Bài liên quan
0