Стандартни вградени обекти в EcmaScript

Вградени обекти (built-in objects)

Въведение

В JavaScript съществуват няколко (със всяка версия се увеличават) вградени обекти/конструктори на обекти, чрез които се разширява функционалността и гъвкавостта на езика. Например:

            // using built in Math object
            console.log( Math.max(2,12,5)); // 12

            // using built in Date() constructor
            let currentDate = new Date();
            console.log( currentDate.getFullYear() ); // 2018
        

Някои от най-често използваните вградени обекти/функции са:

Math
Date
String
Number
Array

Ако сте любопитни относно другите: Standard built-in objects @MDN

Работа с дати (Date objects)

Текущата дата и време в компютърните системи се представят като брой милисекунди изминали от началото на епохата (1 January 1970 UTC)
За да работим с измерения, като година, месец, час и пр. трябва да използваме вградените методи на обект от тип Date, който създаваме като използваме конструктора Date()

                let currentDateTimeObj = new Date();
            
Справочник: Date @MDN

getCurentTimeFormated - пример

See the Pen getCurentTimeFormated by Iva Popova (@webdesigncourse) on CodePen.

calcUserAge - пример

See the Pen calcUserAge by Iva Popova (@webdesigncourse) on CodePen.

dateObjectForTimingCode - пример

See the Pen Date object for timing code by Iva Popova (@webdesigncourse) on CodePen.

arguments object

За да имплементираме функция с променлив брой параметри в JavaScript можем да използваме вградения обект arguments
Той се използва единствено в тяло на функция и съдържа подобна на масив структура с аргументите подадени към функцията.

            // using built in arguments object - available within functions only!
            function sum(){
                sum = 0;
                for (let i = 0; i < arguments.length; i++){
                    sum += arguments[i];
                }
                console.log("sum = " + sum);
            }
            sum(1,2,3); // 6
            sum(1,2,3,4); // 10
        

Primitive Objects Boxing (Wrapping)

Primitive Objects Boxing (Wrapping)

built-in objects == primitive types?

Примитивните типове (string, number, boolean) не са обекти и нямат методи или свойства.
Но в JS са дефинирани специални вградени обекти (String, Number, Boolean), които предоставят методи и свойства за работа с примитивни стойности.

                // Създаваме обект от тип String
                let str1 = new String("ada");

                // Създаваме стринг, който не е обект
                let str2 = "ada";

                console.log( typeof(str1) ); // object
                console.log( typeof(str2) ); // string
            
Примитивите и обектите са различни:

                console.log(str1 == str2);  // true (сравнение по стойност)
                console.log(str1 === str2); // false (различни типове)
            

Primitive Objects Boxing (Wrapping)

Когато опитаме да използваме примитивен тип ( string, number и пр.) като обект, JavaScript автоматично "обвива" примитивния тип в съответния обектен тип (String, Number, Boolean), за да може да използва съответните методи и свойства.

                // примитивните типове не са обекти и нямат пропъртита, но следното работи:
                "ada".toUpperCase(); // "ADA"

                // стойността "ada" временно се обвива в обект String, върху който се извиква метода
                (new String("ada")).toUpperCase()
            
Но примитивите не са обекти

                let str1 = new String("ada");
                let str2 = "ada";

                str1.id = 1;
                str2.id = 1;

                console.log(str1.id);// 1
                console.log(str2.id);// undefined
            

Best Practices

Добре е да използваме Boxing-a. Т.е. когато се налага да използваме свойство или метод на (String, Number, Boolean) директно да го приложим върху примитива, като знаем, че JS ще го "обвие" в съответния обект, вместо ние да създаваме обекта.

            // създаваме число като примитив (добър вариант)
            let x = 42;

            // създаваме число като обект (ненужно сложно)
            let y = new Number(42);

            // използваме ги по един и същ начин:
            console.log( x + 10 ); // 52
            console.log( y + 10 ); // 52

            console.log( x.toPrecision(5) ); // "42.000"
            console.log( y.toPrecision(5) ); // "42.000"

            // но не бива да забравяме, че "x" и "y" са различни типове
            console.log( x == y )  // true
            console.log( x === y ) // false
        

Readings

The Secret Life of JavaScript Primitives

These slides are based on

customised version of

Hakimel's reveal.js

framework