Статьи

Работа с примитивной строкой, числом и логическими значениями

Не удивляйтесь тому факту, что строковые, true.toString() и логические литералы могут рассматриваться как объект со свойствами (например, true.toString() ). Когда эти примитивные значения обрабатываются как объекты при попытке доступа к их свойствам, JavaScript создаст объект-оболочку из связанного конструктора примитива, так что к свойствам и методам объекта-оболочки можно будет получить доступ.

Как только к свойствам был получен доступ, объект-оболочка отбрасывается. Это преобразование позволяет нам написать код, который бы выглядел так, как если бы примитивное значение было фактически объектом. По правде говоря, когда он обрабатывается как объект в коде, JavaScript преобразует его в объект, так что доступ к свойству будет работать, а затем преобразует его обратно в примитивное значение, как только будет возвращено значение. Главное, на что нужно обратить внимание, это то, что происходит, и что JavaScript делает это для вас за кулисами.


Вот несколько примеров, чтобы продемонстрировать, о чем я говорю:

Пример строки: sample56.html

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<!DOCTYPE html><html lang=»en»><body><script>
 
    // String object treated like an object.
    var stringObject = new String(‘foo’);
    console.log(stringObject.length);
    console.log(stringObject[‘length’]);
 
    // String literal/primitive converted to an object when treated as an object.
    var stringLiteral = ‘foo’;
    console.log(stringLiteral.length);
    console.log(stringLiteral[‘length’]);
    console.log(‘bar’.length);
    console.log(‘bar'[‘length’]);
 
</script></body></html>

Образец номера: sample57.html

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<!DOCTYPE html><html lang=»en»><body><script>
 
    // Number object treated like an object.
    var numberObject = new Number(1.10023);
    console.log(numberObject.toFixed());
    console.log(numberObject[‘toFixed’]());
 
    // Number literal/primitive converted to an object when treated as an object.
    var numberLiteral = 1.10023;
    console.log(numberLiteral.toFixed());
    console.log(numberLiteral[‘toFixed’]());
    console.log((1234).toString());
    console.log(1234[‘toString’]());
 
</script></body></html>

Логический пример: sample58.html

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<!DOCTYPE html><html lang=»en»><body><script>
 
    // Boolean object treated like an object.
    var booleanObject = new Boolean(0);
    console.log(booleanObject.toString());
    console.log(booleanObject[‘toString’]());
 
    // Boolean literal/primitive converted to an object when treated as an object.
    var booleanLiteral = false;
    console.log(booleanLiteral.toString());
    console.log(booleanLiteral[‘toString’]());
    console.log((true).toString());
    console.log(true[‘toString’]());
 
</script></body></html>

При непосредственном доступе к свойству примитивного числа (не хранящегося в переменной) необходимо сначала оценить число, прежде чем значение будет обработано как объект (например, (1).toString(); или 1..toString(); ). Почему две точки? Первая точка считается десятичным числом, а не оператором для доступа к свойствам объекта.


Литеральные / примитивные значения, представляющие строку, число или логическое значение, быстрее записываются и более кратки в буквальной форме.

Вы должны использовать буквальное значение из-за этого. Кроме того, точность оператора typeof зависит от того, как вы создаете значение (литеральный вызов или вызов конструктора). Если вы создаете строку, число или логический объект, оператор typeof сообщает тип как объект. Если вы используете литералы, оператор typeof возвращает строковое имя фактического типа значения (например, typeof 'foo' // returns 'string' ).

Я демонстрирую этот факт в следующем коде.

Образец: sample59.html

01
02
03
04
05
06
07
08
09
10
11
12
13
<!DOCTYPE html><html lang=»en»><body><script>
 
    // String, number, and Boolean objects.
    console.log(typeof new String(‘foo’));
    console.log(typeof new Number(1));
    console.log(typeof new Boolean(true));
 
    // String, number, and Boolean literals/primitives.
    console.log(typeof ‘foo’);
    console.log(typeof 1);
    console.log(typeof true);
 
</script></body></html>

Если ваша программа зависит от оператора typeof для идентификации строковых, числовых или логических значений в терминах этих примитивных типов, вам следует избегать конструкторов String , Number и Boolean .