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 :)))))
Bài liên quan
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 :)))))
và
thế này chắc bạn hiểu rồi chứ
window.name = tên của cửa sổ hiện tại
Bạn gõ name = xyz tức = window.name = xyz
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ử:
Viết kiểu này có nghĩa là convert type của status thành type của name hả bạn.
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)
“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à.
Output
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ặcconst
thay chovar
là được.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ả.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 khiURL
là web api, có method để tạo blob url, làm lỗi mất script của mình.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ị.
đoán kết quả xem :v
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.
Hai luật đầu tiên của
A == B
nếu A và B khác type.Hai luật tiếp theo được áp dụng của
==
A == [[ToPrimitive]](B)
[[ToPrimitive]](A) == B
Tương đương
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à []
Cũng trong ToPrimitive, gọi tiếp
[[ToString]]
lên giá trị trả về củavalueOf()
, 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ành2 luật tiếp nữa của
==
được áp dụng:A == ToNumber(B)
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.
Sẵn mình ôn bài luôn
Bác biết nhiều nhỉ từ js đên jav -.-, bác đi làm mấy năm rồi?
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.
Vậy là quá giỏi :D,
Nghiên cứu kỹ thế này sẽ tiến xa lắm đây…