Веб-статья была впервые опубликована в общедоступной учетной записи WeChat двух программистов.Я надеюсь общаться с вами больше и вместе добиваться прогресса~
Прежде чем говорить о нескольких вариантах использования toString(), давайте поговорим о разнице между string() и toString():
1. И String(), и toString() могут быть преобразованы в строковые типы, но toString() не может преобразовать null и undefined, потому что null и undefined не имеют своих собственных объектов-оболочек и не могут получить доступ к методу toString() объекта,Ссылка на свойство объекта-оболочки заканчивается, и вновь созданный временный объект будет уничтожен.
Так рождается вопрос лица:
var s = 'test';
s.len = 4;
var t = s.len;
//试问 t输出什么
Строка не является объектом, так как же она может ссылаться на методы объекта?
Это связано с тем, что строка имеет соответствующий тип оболочки, который может преобразовать строку в объект.Этот объект можно использовать для обработки ссылки на свойство.После окончания ссылки вновь созданный объект будет уничтожен. Когда var t = s.len запускается снова, новый объект создается путем повторной упаковки объекта, но новому объекту не присваивается значение len, поэтому вывод вышеуказанного вопроса не определен.
Что, если вы добавите свойство к ссылочному типу?
var a = []
a.len = 4
console.log(a.len) // 还是4
Потому что ссылочный тип существует в памяти до того, как покинет текущую область видимости, а объект типа-обертки существует только во время выполнения кода, и он уничтожается сразу после выполнения. Таким образом, мы не можем добавлять свойства и методы для примитивных типов данных во время выполнения.
Кровавый случай, вызванный toString(): В проекте я полностью доверяю данным, возвращаемым сервером, и вызываю метод toString(), который заставляет страницу сообщать об ошибке, woo woo woo~ Друзья, вы должны быть осторожны при написании кода.
Использование toString():
- Может преобразовать основание числа (2-36 основание)
var a = 10;
a.toString(2) // "1010"
a.toString(8) // "12"
a.toString(16) // "a"
Используя базовое преобразование toString(), можно сгенерировать случайный проверочный код.
Math.random().toString(36).substring(3,7) //生成四位数的随机验证码
- Определить тип данных (базовые данные и справочные данные)
Object.prototype.toString.call(Array) // "[object Function]"
Object.proptotype.toString.call([]) // "[object Array]"
Потому что если мы хотим получить реальный встроенный тип объекта, нам нужно получить значение свойства объекта [[Class]].До es5 значение свойства может быть доступно только Object.prototype.toString, поэтому , через Object .prototype.toString.call(arr) изменяет указатель this метода tostring для получения встроенного типа объекта.
[[Class]]这个内部属性是引擎内部用来判断一个对象是属于哪种类型的值。
所有typeof返回值为“object”的对象(如数组)都包含一个内部属性[[class]]
При использовании toString() для обычных функций будет получено содержимое этой функции, а при использовании toString для встроенных функций будет возвращена строка «[собственный код]».
function test(){
alert(1);//test
}
test.toString();
/*"function test(){
alert(1);//test
}"*/
Function.toString();//"function Function() { [native code] }"
Кстати, поговорим о typeof и instanceof
- тип:
Typeof может точно определить только базовый тип данных, чтобы судить о типе данных, и он не точен для эталонного типа данных.
Тип двух форм:
typeof(表达式)
typeof 变量名
//返回值:string, number, boolean, undefined, object( null 也返回object), function, symbol
Например:
typeof NaN // number
typeof Symbol(1) // "symbol"
- A instanceof B:
[объект] instanceof [конструктор]
Принцип: Экземпляр A не находится в конструкторе B
A слева должен быть объектом, если это данные базового типа, он вернет false напрямую
Для сложных типов данных:
let reg = new RegExp(//)
reg instanceof RegExp // true
reg instanceof Object // true
let date = new Date()
date instanceof Date // true
date instanceof Object // true
так что используйтеObject.prototype.toString.call(xxx)Тип возвращаемых данных является наиболее надежным, а возвращаемое значение представляет собой строковое представление объекта [тип данных объекта].
Чего вы ждете? Используйте надежный Object.prototype.toString.call(xxx) прямо сейчас.