2015年11月7日土曜日

JavaScriptまとめ3()

ただし、これは ECMAScript3 の仕様での話です。ECMAScript5 の仕様からグローバル変数 undefined についての記述を引用します。
http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262%205th%20edition%20December%202009.pdf
15.1.1 Value Properties of the Global Object
15.1.1.3 undefined
The value of undefined is undefined (see 8.1). This property has the attributes { Writable: false, Enumerable: false, Configurable: false }.
ECMAScript5 の仕様では undefined プロパティの Writable が flase となっていますので、値を変更することができなくなりました。






undefined はただのグローバル変数


こんなことだって可能
alert(undefined); // "undefined"
var undefined = "こんにちは";
alert(undefined) // "こんにちは"



自分の意思でundefinedを自由に書き換えることができる
つまり、undefinedは常にundefinedである保証はどこにもないから、undefinedを使うのを避けるべきとうことです。
対して、void演算子を使えば、常に本当のundefinedを返すので、安全です。


function test () {
    var undefined = true; //undefinedを上書き

    if(undefined){
        console.log( 'undefined: ' + undefined );
    }

    if(void 0 ){
        console.log( '決して実行されない' );
    }
}

test();


voidを使わずにundefinedを獲得する方法

(function(a,b,undefined){
    console.log(undefined)
})(1,2);

これはjQueryのソースでも使われている手法
無名関数をその場で実行し、実引数には1,2しか渡していないのに、仮引数のほうではa,b以外に、
もう一つundefinedという最初から渡されないと仮定した仮引数をセットすることで、安全にundefinedを獲得


○参考
 `undefined`の代わりに、`void 0`を使ったほうがいい
http://liginc.co.jp/web/js/38494

2015年8月3日月曜日

システム殴り書き備忘録1

CSS
http://www.slideshare.net/hiloki/a-good-css-and-sass-architecture?related=1

jQUeryアンチパターン
http://www.slideshare.net/paul.irish/perfcompression

実例で学ぶ、JOIN (NLJ) が遅くなる理屈と対処法
http://qiita.com/yuku_t/items/208be188eef17699c7a5?utm_content=buffer77626&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer

忘れがちなJavaScriptの基礎中の基礎
http://qiita.com/Yama-to/items/5e0827dfd2bd440537d0?utm_content=buffer8fe4a&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer

2015年6月18日木曜日

PHPまとめ1:エルビス演算子

/*━━━━━━━━━━━━━━■PHP■━━━━━━━━━━━━━━*/
○エルビス演算子
$c = $a ?: $b;

○三項演算子の場合
$c = $a ? $a : $b;


/*━━━━━━━━━━━━━━■JavaScript■━━━━━━━━━━━━━━*/
c = a || b;

・補足
JavaScriptでは、論理演算子&& ||の比較対象としてBoolean以外の値を指定した場合、その値をBooleanに変換せず返します。
よってJavaScriptでは論理演算子||をエルビス演算子の代わりとして用いることが出来ます。

論理演算子&& ||がBoolean以外の値を返すのはJavaScriptに限った話ではありません。
他のプログラミング言語でもこのような実装になっている言語が存在します。
よってこの記事で紹介したテクニック(と呼べるほどの事かは疑問ですが)はJavaScript以外の言語でも利用できます。


/*━━━━━━━━━━━━━━■PHP7で2項演算子「??」が新設■━━━━━━━━━━━━━━*/

オペランドがnull以外の値であればその値を、そうでなければ右オペランドを返す
var_dump(null ?? false ?? true); // false

これはPHP 5.3で導入されたエルビス演算子「?:」と少し似ています。
エルビス演算子は真偽の判断
??演算子はnullかどうかの判断を行う点が異なる

var_dump(null ?: false ?: true); // true

それだけでなく、??演算子はisset()と同様に未定義値をチェックしてもエラーになりません。
これは非常に大きな違いで、??演算子があれば今までのisset()地獄から解放されるかもしれません。

var_dump($arr["foo"] ?: "bar"); // 未定義だとUndefined variableかUndefined indexで怒られちゃう
var_dump(isset($arr["foo"]) ? $arr["foo"] : "bar"); // 結局こう書いてたよね…
var_dump($arr["foo"] ?? "bar"); // PHP7ではこれで動く!

PHP7調査(11)??演算子の新設
JavaScriptではエルビス演算子を論理演算子で代用できる
エルビス演算子でスマートに変数を初期化