Что означает запятая в конструкции (x = x || y, z)?

Итак, я натолкнулся на ответ, но этого недостаточно для расширения моей базы знаний.

Я долго искал, что означает x = x || y, z в StackOverflow

Я нашел это. Что означает конструкция x = x || у значит?

Но проблема в том, для чего , z?

Я часто вижу эти выражения window.something = window.something || {}, jQuery

Я уже знаю, что если false было возвращено по первому аргументу, то {} будет присвоено свойству something.

Мой вопрос: для чего , jQuery?

Может ли кто-нибудь просветить меня и дать мне это очень важное знание?

ОБНОВЛЕНИЕ 8/11/2014

Поэтому я попытался сделать тесты.

var w = 0, x = 1,y = 2,z = 3;
var foo = w || x || y, z; //I see that z is a declared variable
console.log(foo); //outputs 1

и он такой же, как этот.

var w = 0, x = 1,y = 2;
var z = function(){return console.log("this is z");}
var foo = w || x || y, z; //same as this
console.log(foo); //still outputs 1

другой.

var w = 0, x = 1,y = 2;
var z = function(){return console.log("this is z");}
function foobar(){
this.bar = console.log(foo,z);
}(foo = w || x || y, z);
foobar(); //outputs 1 and string code of foobar

изменение значения z в (foo = w || x || y, z).

var w = 0, x = 1,y = 2;
var z = function(){return console.log("this is z");}
function foobar(){
this.bar = console.log(foo,z);
}(foo = w || x || y, z=4);
foobar(); //outputs 1 and 4

Я предполагаю, что размещение переменных внутри ( ) после } функции аналогичен объявлению новой переменной.

Еще один тест.

var w = 0, x = 1,y = 2,z = 1;
function foobar(){
    var bar = 10,z=2;
        console.log(z);
}(foo = w || x || y, z=4);
console.log(foo,z); // Seems that foo is public and made an output
foobar(); // outputs the z = 2 inside and disregards the z = 4 from (..., z=4)
console.log(z); // It seems that z is 4 again after calling foobar

Однако в таком сценарии. Ссылка на JSFiddle

//Self-Executing Anonymous Function: Part 2 (Public & Private)
(function( skillet, $, undefined ) {
    //Private Property
    var isHot = true;

    //Public Property
    skillet.ingredient = "Bacon Strips";

    //Public Method
    skillet.fry = function() {
        var oliveOil;

        addItem( "\t\n Butter \n\t" );
        addItem( oliveOil );
        console.log( "Frying " + skillet.ingredient );
    };

    //Private Method
    function addItem( item ) {
        if ( item !== undefined ) {
            console.log( "Adding " + $.trim(item) );
        }
    }    
}( window.skillet = window.skillet || {}, jQuery ));

//Public Properties
console.log( skillet.ingredient ); //Bacon Strips

//Public Methods
skillet.fry(); //Adding Butter & Fraying Bacon Strips

//Adding a Public Property
skillet.quantity = "12";
console.log( skillet.quantity ); //12

//Adding New Functionality to the Skillet
(function( skillet, $, undefined ) {
    //Private Property
    var amountOfGrease = "1 Cup";

    //Public Method
    skillet.toString = function() {
        console.log( skillet.quantity + " " + 
                     skillet.ingredient + " & " + 
                     amountOfGrease + " of Grease" );
        console.log( isHot ? "Hot" : "Cold" );
    };    
}( window.skillet = window.skillet || {}, jQuery ));

try {
    //12 Bacon Strips & 1 Cup of Grease
    skillet.toString(); //Throws Exception
} catch( e ) {
    console.log( e.message ); //isHot is not defined
}

Похоже, что если вы удалите , jQuery, он будет регистрировать только «полоски бекона» Перейдите по этой ссылке Ссылка на другой JSFiddle (, jQuery удалено)

Я действительно не понимаю этого .. Но почему , jQuery внутри ( ) после того, как } функции считается ссылкой для кода, выполняемого полностью, когда библиотека jQuery уже включена?

После удаления $.trim из кода он снова работает нормально. Но я до сих пор не понимаю, как работает эта ссылка. Ссылка на JSFiddle без, jQuery и $ .trim

7 голосов | спросил Mike Ante 11 AM00000070000002231 2014, 07:26:22

1 ответ


0

оператор запятой в JavaScript оценивает операнды и возвращает значение последнего (крайнего справа). Автор JS приоритет оператора , операция OR сначала оценивать, а затем присваивать.

Итак, это выражение x = x || y, z действительно (x = (x || y)), z

ответил nbrooks 11 AM00000070000001931 2014, 07:32:19

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132