JavaScript жолындағы литералдар мен String нысандарының арасындағы айырмашылық неде?

Taken from MDN

Сызық литералдары (қосарлы немесе жалғыз тырнақша арқылы белгіленеді) және жолдар   String қоңырауларынан конструкторлық контекстен қайтарылды (яғни, жоқ   жаңа кілт сөзді пайдалану) қарабайыр жолдар. JavaScript автоматты түрде   ол примитивтерді String нысандарына түрлендіреді, сондықтан оны пайдалануға болады   Қарапайым жолдарға арналған стръект объектілі әдісі. Контексттерде a   әдісі қарабайыр жолда немесе мүлікті іздеуде шақырылады   JavaScript автоматты түрде қарабайыр жолды орап алады   әдісті шақырыңыз немесе мүлікті іздеуді орындаңыз.

Мәселен, қисынды деп санаймын (қисынды) операцияларды (әдіс қоңыраулар) жолдардағы операцияларға қарағанда баяу болуы керек Objects, себебі кез келген жолдың литералы жолға түрлендіріледі (қосымша жұмыс) әдісі жол.

Бірақ бұл сынақ жағдайы , нәтиже керісінше. код блок-1 код блокты-2 қарағанда жылдамырақ жұмыс істейді, код блоктары төменде келтірілген:

код блогы-1:

var s = '0123456789';
for (var i = 0; i < s.length; i++) {
  s.charAt(i);
}

код блогы-2:

var s = new String('0123456789');
for (var i = 0; i < s.length; i++) {
    s.charAt(i);
}

Нәтижелер браузерлерде өзгереді, бірақ код блок-1 әрқашан жылдамырақ болады. Мұны түсіндіріп беріңіз, неге код блок-1 код блокты-2 қарағанда жылдамырақ.

85
бұл туралы '0123456789'.charAt (i) ?
қосылды автор Yuriy Galanter, көзі
@SheikhHeera Мен білемін, мен жай ғана қызықпаймын, ол тіпті жылдамырақ болады
қосылды автор Yuriy Galanter, көзі
Бұл қызығы: revision 2
қосылды автор hjpotter92, көзі
@PaulS, бұл тек бір себеп бар ма?
қосылды автор The Alpha, көзі
@YuriyGalanter, бұл мәселе емес, бірақ code block-1 неге жылдамырақ екенін сұраймын?
қосылды автор The Alpha, көзі
Сызық нысандар нақты өмірлік контекстте көруге болатын сирек кездеседі, сондықтан ауызша аудармашылардың жол мәтіндерін оңтайландыруы таңқаларлық емес. Бүгінгі күні сіздің кодыңыз түсіндірілген ғана емес, сценарийлер артта болатын көптеген оңтайландыру қабаттары бар.
қосылды автор Fabrício Matté, көзі
new String дегенді қолдану Object басқа қабатының мөлдір қабатын енгізеді. typeof new String ();//«объект»
қосылды автор Paul S., көзі
@ hjpotter92 - бұл кэштаудың нәтижесі
қосылды автор Paul S., көзі

8 жауаптар

JavaScript негізгі екі түрі бар, примивитами және объектілер.

var s = 'test';
var ss = new String('test');

Жалғыз цитата/қос тырнақшалар функционалдық тұрғыдан бірдей. Сонымен қатар, атын қоюға тырысқан мінез-құлық автоматты бокс деп аталады. Мәселен, бұл шын мәнінде болып табылады, бұл қарабайыр протягивается оның түріне түрлендіргіштен кезде, әдісімен қабықтың. Қарапайым:

var s = 'test';

Қарапайым деректер түрі. Бұл ешқандай әдіс жоқ, ол шифрлі деректерді жадыға сілтеме жасайтын көрсеткіштен басқа ештеңе емес, ол жылдамырақ жылдамдықпен жылдам қатынауды түсіндіреді.

Мысалы, s.charAt (i) , мысалы, не болып жатады?

s үлгісі String данасы болмағандықтан JavaScript оның typeof string бар s typeof object немесе одан да дәл s.valueOf (s) .prototype.toString.call = [Object String] түріндегі String түрін таңдаңыз.

Автоматты бокстық мінез-құлық s қажет болса, оның орауыш түріне дейін алға жылжытады, бірақ стандартты әрекеттер керемет жылдам, өйткені қарапайым деректер түрімен айналысады. Алайда, авто-бокс және Object.prototype.valueOf әр түрлі әсерлері бар.

Егер сіз автоматты боксты күштеп немесе қарабайырдың қабықша түріне ауысуды қаласаңыз, Object.prototype.valueOf пайдалануыңызға болады, бірақ мінез-құлық өзгеше. Авто-бокстың көптеген сценарийлеріне сүйене отырып, айнымалылардың қарабайырлық сипатын өзгертпестен «қажетті» әдістер қолданылады. Нақ сондықтан сіз жылдамдығын арттырасыз.

107
қосылды

Бұл әдетте іске асыруға тәуелді, бірақ мен атуды аламын. Мен V8-мен мысалға келтіремін, бірақ басқа қозғалтқыштар ұқсас тәсілдерді қолданады деп ойлаймын.

Қарапайым жол v8 :: String нысанына талданды. Демек, jfriend00 деп аталған әдістерге тікелей сілтеме жасауға болады.

Екінші жағынан, String нысаны v8 :: StringObject v8 :: String үшін Object кеңейтетін және толыққанды объект болып табылмайтын, кеңейтуші ретінде қызмет етеді.

Енді new String ('') әдісіне шақыру тек қана логикалық, бұл v8 :: StringObject 's v8 :: String әдісін орындамас бұрын, ол баяуырақ болады.


Көптеген басқа тілдерде қарапайым құндылықтарда әдістер жоқ.

MDN қалай жасайды, мысалы,

/em> мәндері әдістерді шақыруы мүмкін.

Дегенмен, ақылды қозғалтқыш String нысанына primitiv-y жолын түрлендіреді, әр әдісті шақырған кезде. Бұл сондай-ақ қарабайыр қасиеттерді (және «әдістер» ¹) шешуге қатысты Аннотированные ES5 spec. құндылықтар:

ЕСКЕРТПЕ 1-қадамда жасалуы мүмкін нысан жоғарыда көрсетілген әдіске кірмейді. Іске асыру объектіні нақты жасаудан аулақ болуды таңдауы мүмкін. [...]

Өте төмен деңгейде Strings жиі өзгермейтін скалярлық мәндер ретінде іске асырылады. Мысал қабық құрылымы:

StringObject > String (> ...) > char[]

Қарабайырдан әлдеқайда алыс болсаңыз, соғұрлым ұзақ уақыт оған жету керек. Іс жүзінде String примитивтері StringObject қарағанда әлдеқайда жиі кездеседі, демек, қозғалтқыштар үшін String примитивтеріне тиісті (түсіндірілген) нысандарға әдістер қосу үшін тосын емес. MDN түсініктемесі ретінде String және StringObject арасындағы кері және артқа айналдырудың орнына.


¹ JavaScript-де «әдіс» функциясы функцияның мәніне түзететін сипат үшін жай ғана конвенцияны білдіреді.

27
қосылды
Оқасы жоқ. =] Енді мен MDN түсініктемесі авто-боксты түсінудің ең оңай жолы немесе ES спецификациясында оған қандай да бір сілтеме бар ма екен деп ойлаймын. тексеру үшін сәтте, егер анықтаманы тапсам, жауапты жаңартуды ұмытпаңыз.
қосылды автор Fabrício Matté, көзі
V8-ні іске асыруда үлкен түсінік. Мен бокстың функцияны шешу үшін ғана емес, қосып қойамын. Сондай-ақ, осы сілтемеде әдіске өтуге болады. Енді V8 бұл кірістірілген әдістер үшін өткізіп жібермейтініне сенімді емеспін, бірақ String.prototype деп айту үшін өзіңіздің кеңейтіміңізді қоссаңыз, әр жолы ол шақырылған жолдың жолақ нұсқасын аласыз.
қосылды автор Ben, көзі

Жолдың литералы болған жағдайда қасиеттерді тағайындауға болмайды

var x = "hello" ;
x.y = "world";
console.log(x.y);//this will print undefined

String Object жағдайда, біз қасиеттерді тағайындауға болады

var x = new String("hello");
x.y = "world";
console.log(x.y);//this will print world
10
қосылды
Ақыр соңында біреу бізге String нысандарына не қажет екенін дәлелдейді. Рақмет сізге!
қосылды автор Ciprian Tomoiagă, көзі

new қолдансаңыз, сіз нысанды данасын жасау қажет екенін анық білдіресіз. Сондықтан new String String

дегенді білдіреді.

typeof new String();//"object"
typeof '';          //"string"

Түрлі түрлерде болғандықтан JavaScript аудармашы оларды әртүрлі түрде оңтайландыруы мүмкін, ескертулерде көрсетілгендей a>.

9
қосылды

Жолдың символы:

Сызықтағы литералдар өзгермейді, яғни олардың пайда болғаннан кейін олардың күйін өзгерту мүмкін емес, бұл олардың жіп қауіпсіздігін қамтамасыз етеді.

var a = 's';
var b = 's';

a==b result will be 'true' both string refer's same object.

Жолдың нысаны:

Мұнда екі түрлі нысан құрылады және олардың әртүрлі сілтемелері бар:

var a = new String("s");
var b = new String("s");

a==b result will be false, because they have different references.

9
қосылды
a және b екеуі үшін a [0] = 'X' тағайындауға тырысыңыз, бұл /b> сәтті орындалады, бірақ күткендей жұмыс істемейді
қосылды автор ruX, көзі
Жолдың нысаны өзгермейді ме?
қосылды автор Yang Wang, көзі

Сіз мәлімдеген кезде:

var s = '0123456789';

сіз қарабайыр жол жасайсыз. Қарапайым жолдың бұл жолы, қарабайырды бірінші сыныпты нысанға айналдырусыз, оған әдістерді шақыруға мүмкіндік беретін әдістер бар. Мәселен, бұл жолдың объектіге түрлендіруі керек болғандықтан, бұл баяу болатынын болжайды. Нысанды түрлендірудің қажеті жоқ. Қарабайыр өздігінен әдістерді шақыра алады.

Оны толықтай жарылған нысанға айналдырыңыз (ол оған жаңа қасиеттерді қосуға мүмкіндік береді) - бұл қосымша қадам және жолды оятарды жылдамырақ жасамайды (шын мәнінде сіздің тестіңіз оларды баяу етеді деп көрсетеді).

5
қосылды
Қарапайымдылық жолында прототиптің барлық қасиеттері, соның ішінде String.prototype болып табылады.
қосылды автор Yuriy Galanter, көзі
Менің ойымша, мұндай жағдай орын алды деп ойладым, яғни var s = 'me'; мен me.charAt (1) деп атағанда мен , жаңа String (me) дегенді жасайды.
қосылды автор The Alpha, көзі
@ FabrícioMatté, сондықтан олар физикалық объектіге айналдырылмайды, дұрыс?
қосылды автор The Alpha, көзі
@ jfriend00, егер ол жолдың литералдары string Object түрлендірілсе, онда бұл нені білдіреді?
қосылды автор The Alpha, көзі
var s = '0123456789'; - бұл қарапайым құндылық, бұл әдіс әдістерді қалай қолдануға болады, мен шатастырамын!
қосылды автор The Alpha, көзі
@SheikhHeera «жолға түрлендіреді» нысаны - бұл әдістердің әдістерін қалай қолдануға болатынын түсіндіру үшін MDN түсіндіреді. Олар String Objects-ға ғана емес айналдырылады.
қосылды автор Fabrício Matté, көзі
@SheikhHera Көп жағдайда олар болып табылады , аудармашылардың іске асырылуын ескере отырып, қазірдің өзінде нысандар.
қосылды автор Fabrício Matté, көзі
@SheikhHeera Мұны жиі шатасымды азайту үшін түсіндіреді, бірақ көріп тұрғаныңыздай, бұл қажетсіз және аудармашы жаңа себепсіз себеп болмайды. Мен осы жауаптардағы кейбір бос биттерді қосу кезінде суретке түсуім мүмкін.
қосылды автор Fabrício Matté, көзі
@YuriyGalanter - Сіз қарабайыр барлық прототиптің қасиеттері бар деп ойлайсыз? Сіз тексеріп отырған код арқылы объектіге нақты түрде айналдырылмайтынына сенімдісіз бе? Javascript отладчике қарабайырға қараған кезде, ол ешқандай қасиеттерге ие емес. Бұл жай ғана қарабайыр.
қосылды автор jfriend00, көзі
@SheikhHeera - примитивтер тілдің орындалуына кіреді, сондықтан аудармашы оларға арнайы өкілеттіктер бере алады.
қосылды автор jfriend00, көзі
@SheikhHeera - Мен соңғы түсініктеме/сұрақты түсінбеймін. Жалғыз қарабайыр өзіңізге өзіңіздің қасиеттеріңізді қосуды қолдамайды. Осыны рұқсат ету үшін, javascript-да String нысаны бар, ол бірдей жолдарды қарабайыр жолмен бірдей, бірақ объектіге барлық жолдармен өңдей алатын толыққанды объект болып табылады. Бұл қосарлы пішін өте аз болып көрінеді, бірақ менің ойымша, бұл 99% жағдайда примитивтерді пайдалану болып табылады, себебі олар жолдарға қарағанда тезірек және көп еске тиімді болуы мүмкін.
қосылды автор jfriend00, көзі
@SheikhHeera - жоқ. Сіз менің жауапты оқыдыңыз ба? Javascript аудармашы толығымен тасаланған JavaScript нысанына айналдырусыз тікелей әдіспен жол әдістерін шақыра алады.
қосылды автор jfriend00, көзі
{type: ENUM.STRING, data: b «\ x6d \ x65»} сияқты 'me' сияқты кодты әдетте JavaScript
қосылды автор Paul S., көзі
@YuriyGalanter ішіне, JavaScript барлық нәрселерді литералдардан емес, құрылым ретінде қарастырады, DOMString құрылымы String-мен байланыстыратын «бұл жол» жалауы бар. прототипі
қосылды автор Paul S., көзі
hmm қызықты пікірлер мен жауаптар, осы сұраққа жауап беру туралы ой ... btw superb @ jfriend00
қосылды автор Thalaivar, көзі

Нысанның болуы ECMAScript/JavaScript қозғалтқыштарындағы Стратегияның іс жүзіндегі мінез-құлқымен аз әрекет етеді, себебі түбірлік кеңістікте ол үшін функционалдық нысандар бар. Осылайша, string әріптері үшін charAt (int) функциясы ізделіп, орындалады.

Нақты затпен сіз тағы бір қабатты қосасыз, мұнда charAt (int) әдісі сонымен қатар стандартты мінез-құлықтың алдында (жоғарыдағы сияқты) нысанның өзінде де ізделеді. Шамамен, бұл жағдайда таңғажайып үлкен жұмыс көлемі бар.

BTW Мен примитивтер шынымен Objects деп ойлаймын, бірақ сценарий қозғалтқышы бұл айнымалы мәнді тек қана string түрінде белгілейді және сондықтан ол сізге берілген барлық функцияларды табуға мүмкіндік береді, осылайша сіз объектіні шақырған сияқтысыз. Мынаны ұмытпаңыз, бұл сценарий орындау уақыты, ол әр түрлі принциптерде жұмыс істейді.

3
қосылды

Бұл мәселе бұрыннан шешілгенін көріп тұрмын, жолдың литералдары мен жол объектілерінің арасындағы нәзік айырмашылық бар, өйткені ешкім оны қозғамаған сияқты, мен оны толығымен жазу үшін жазар еді деп ойладым.

Негізінен екеуінің арасындағы айырмашылық - бағалауды қолдану кезінде. Бағалау ('1 + 1') 2 береді, ал бағалау (жаңа String ('1 + 1')) '1 + 1' береді, сондықтан, егер кодтың белгілі бір блогы «қалыпты» немесе «eval» елеулі нәтижелерге алып келеді

2
қосылды
Кіруіңізге рахмет :-)
қосылды автор The Alpha, көзі