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 :)))))

console.log(typeof name)
string

console.log(typeof tenKhac)
object

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

5 Likes

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

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

12 Likes

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);
5 Likes

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)

2 Likes

“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à.

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
4 Likes

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.

7 Likes

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. :unamused:
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. :sweat:

7 Likes

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ị.

3 Likes
null === null  ?
undefined === undefined  ?
undefined === null ?  
undefined == null ?
a = []
b = 0
a==b = ?   

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

1 Like

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 :grin:

5 Likes

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.

3 Likes

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

3 Likes

@hungaya anh làm fullstack ạ

Giờ mình đang tập trung bên Computational Linguistics và Pure Mathematics nhiều hơn, mà dân tình gọi là machine learning. (statistics)

Càng ngày càng đào sâu Pure math, chả biết tương lai ra sao luôn, không học thì thấy thiếu thiếu và mất căn bản, mà học rồi chả thấy vận dụng được chỗ nào cả. :roll_eyes:

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?