タグ

JavaScriptに関するs_hiiragiのブックマーク (32)

  • setTimeout を完璧に理解する

    setTimeout は、指定された時間以降に指定されたコードを実行する JavaScriptAPI です。ブラウザでも Node.js でも広く使われているのですが、実装はまちまちで、色々と特殊な条件も多く、挙動を完璧に理解している人は少ないと思います。この記事では、そんな setTimeout を可能な限り深堀りしてみようと思います。 先に書いておきますが、ものすごくニッチで細かい話ばかり並びます。突然私が、ただ純粋に setTimeout について調べたくなったので、その結果をまとめただけのものです。普通に開発している人には必要のない情報が多くなるでしょう。この記事は基礎から setTimeout を学ぼう、という方には全然向かないと思います。 また、JavaScript のイベントループについてある程度理解していることを前提とします。その詳しい理解には、@PADAone さん

  • [jQuery] $(‘form').change()でフォーム全体の変更を監視する | きほんのき

    トップページ jQuery [jQuery] $(‘form’).change()でフォーム全体の変更を監視する [jQuery] $(‘form’).change()でフォーム全体の変更を監視する 公開 2012年8月8日(水) jQueryのchange()メソッドは、フォーム要素の値に変更があった時、それを察知して反応します。inputやtextarea、selectにバインドして使うことがほとんどだと思います。 <form action='#' method='post'> フルネーム<input type='text' name='fullname'> パスワード<input type='password' name='pass'> <input type='submit'> </form> <script> $("input[name=fullname]").change(fu

  • JavaScript の空配列を勘違いしていた

    JavaScript の空配列の真偽値について誤った理解をしていたので、自戒の念を込めて記事にしました。もしよかったら読んでみてください。 空配列の真偽値を理解する まずは私の誤解していたケースから見ていきます。 // コード① const foo = []; // 空の配列 if (foo) { console.log("Hello"); } else { console.log("Bye"); } // console.log で表示される結果 Hello コード①のように if 文の条件が空配列の場合は、false とみなされ Bye が表示されると思っていました。しかし、実際には上記のサンプルコードでは true となり、Hello が表示されます。 それでは空配列の場合に false と判断させたい場合のコードを見てみましょう。 // コード② const bar = []; /

    JavaScript の空配列を勘違いしていた
  • 今Partytownがヤバい。JavaScript Sandboxの未来はどっちだ?

    概要 Partytownというプロジェクトが先月発表された。このプロジェクト自体はWebのパフォーマンス向上(3rd Party Scriptによるブロッキングの低減)を主目的としているが、実質ブラウザにおけるJavaScript Sandboxの方向性に一石を投じるものであるとして自分は理解した。稿ではこちらについて背景とともに解説を試みる。 WebブラウザにおけるJavaScript Sandbox JavaScriptで記述されたWebアプリケーションにおいて、たとえばプラグイン機構を実現したいなど、他Partyが提供あるいはユーザ自身が記述したスクリプトを、ホストとなるアプリケーションに影響を与えることなく実行することを許可したい、というケースはままある。2000年代に跋扈したブログパーツの類はWebコンテンツに対するプラグインの代表例とも言えるが、埋め込み先ページに対しての全権

    今Partytownがヤバい。JavaScript Sandboxの未来はどっちだ?
  • JavaScript クイズ解説: NaN === NaN の結果はどうなる?

    先日、このようなツイートを書きました。 久しぶりの JavaScript クイズ。 JavaScript において NaN === NaN の結果は次のうちどれになるでしょうか? — Takuo Kihira (@tkihira) September 7, 2021 答えは 4 の「状況によって上記以外もありうる」です。でも、2 や 3 を選んだ方も、もはや正解だといって差し支えないと思います。 解説が長くなったので、ブログ記事にまとめました。 そもそも NaN とは NaN は “Not a Number” を意味する数値です。数値なのに「Not a Number」というのは違和感があるかもしれませんが、数値表現することが出来ない状態を保持するために便宜的に用意された数値、というようなものです。 NaN は、浮動小数点演算において数値では表現出来ない計算をしようとすると登場します。例えば

  • JavaScript や CSS で ~/ から始まるパスをマッピングして import する方法 2020

    この記事では、マッピングする方法について述べるだけで、それに伴う仕様や実装方法などについては言及しません。 TL;DR import util from '~/util'; のように ~/ から始まるパスにしたとき、 src ディレクトリからの相対パスとしてマッピングするには、2020 年 12 月現在、次の方法があります。 Parcel もしくは Nuxt.js を使う場合、設定しなくても自動でマッピングされます webpack を使う場合、webpack.config.js の resolve.alias を設定します Babel だけを使う場合、 babel-plugin-module-resolver を使って設定します tsc で型チェックする場合、もしくは Next.js を使う場合、tsconfig.json の paths を設定します 「~/ を任意のディレクトリにマッピ

    JavaScript や CSS で ~/ から始まるパスをマッピングして import する方法 2020
  • ES2015+ cheatsheet

    A quick overview of new JavaScript features in ES2015, ES2016, ES2017, ES2018 and beyond. Block scoping Let function fn () { let x = 0 if (true) { let x = 1 // only inside this `if` } } Const const a = 1 let is the new var. Constants work just like let, but can’t be reassigned. See: Let and const Backtick strings Interpolation const message = `Hello ${name}` Multiline strings const str = ` hello w

    ES2015+ cheatsheet
  • for文でのlet変数が毎ループ新スコープを持つようになった - JS.next

    概要 かつてはfor文初期化句で宣言された変数は、for文の直前で宣言されたように振舞っていたが、各ループでスコープを引きづらないように仕様が変更され、V8も追従した。 例 for (let i = 0; i < 5; i++) { ~~~ } これは今までは次のコードと等価だった。 { let i = 0 for (; i < 5; i++) { ~~~ } } つまりfor文中で関数を定義するとこうなっていた。 let funs = [] for (let i = 0; i < 5; i++) { funs.push(function () { return i }) } funs.map(function (fun) { return fun() }) // [5,5,5,5,5] この結果が[0,1,2,3,4]になるのが今回の変更である。 つまり一番最初のコードはこれと等価になる

    for文でのlet変数が毎ループ新スコープを持つようになった - JS.next
  • Callback を撲滅せよ

    ヤフー株式会社は、2023年10月1日にLINEヤフー株式会社になりました。LINEヤフー株式会社の新しいブログはこちらです。LINEヤフー Tech Blog こんにちは。言語サポート(Node.js)チームの伊藤(@koh110)です。 Node.js v10 も10月にLTSとなり async/await によるフロー制御は当たり前のように利用されるようになってきました。JavaScriptの非同期処理は async/await から覚える人も今後増えていくでしょう。今回はそんな非同期処理について、社内での事例を交えて記事を書いていこうと思います。 index Promise 化がなぜ重要なのか ユーザーに promisify をさせる落とし穴 Road to Promise まとめ Promise 化がなぜ重要なのか ちょうど3年前のアドベントカレンダーで、今後はいろいろなモジュー

    Callback を撲滅せよ
  • JavaScriptの等値比較を全部理解する - Qiita

    皆さんこんにちは。今回の記事ではJavaScriptの等値比較について見ていこうと思います。 「どうせ==と===の違いとかだろ? 今さらそんな記事書くなよバーカw」と思った人はぜひ期待せずに読み進めてみてください。 「じゃあObject.isでしょ? 知ってる知ってる、使ったことないけど」と思った人はまあ読まなくても大丈夫です。 さて、等値比較というのは、2つの値が等しいかどうか判定することです。JavaScriptにおいて等値比較はどのように行うのか、そしてどのような場面で等値比較が発生するのかをこの記事では余すことなく紹介します。 以降、この記事で仕様書という場合はECMAScript® 2018 Language Specificationを指すものとします。 ==と=== とはいえ、まずは==と===の話をしないことには始まりません。==はJavaScript初心者がとりあえず習

    JavaScriptの等値比較を全部理解する - Qiita
    s_hiiragi
    s_hiiragi 2018/11/16
    “(意訳)includesメソッドはindexOfとは意図的に異なる仕様にしている部分が2つあります。”
  • JavaScriptの { } を理解する - Qiita

    結果はどうなったでしょうか。 自分が今使っているGoogle Chromeだとこうなりました。 結果は{a: 10}というオブジェクトです。まあ、これは当然ですね。3 + 5と入力すれば実行されて8が返ってくるのですから、{a: 10}というオブジェクトリテラルを書けば{a: 10}というオブジェクトが作られるのは当然です。 ……。 ここで、一部の人は「おいふざけんなよ」と思っているかもしれません。というのも、この例は環境によっては違う結果になるのです。具体的には、Chrome以外2のブラウザのREPL(FirefoxやEdgeなど)が該当します。あと、ts-nodeのREPLも該当するらしいです。これらの環境では、結果は{a: 10}ではなく次のようになります。 オブジェクトを作ったはずなのに結果が10とか意味不明ですね。そもそも、こんな簡単なプログラムで結果が全然違うとか、JavaSc

    JavaScriptの { } を理解する - Qiita
    s_hiiragi
    s_hiiragi 2018/11/09
    “Completion Recordは[[Type]]フィールドと[[Value]]フィールドを持ち7、この2つによって計算結果が表現されます。[[Type]]フィールドはnormal, return, break, continue, throwの5種類があり、[[Value]]は何らかのJavaScriptの値です。”
  • JavaScriptでCSSの擬似クラスを設定する方法

    JavaScriptCSSの擬似クラス(:link/:visited/:hover/:activeなど)を設定する方法を紹介します。 1.問題点 JavaScriptCSSを設定する場合、例えばテキストリンクの色を設定するには、styleプロパティを利用して次のように記述します。 <a href="http://.../">foo</a> <script> var foo = document.getElementsByTagName('a'); foo[0].style.color = '#f00'; </script> ですが、styleプロパティには擬似クラスがなく(というか、そもそもプロパティではない)、 a:link a:visited a:hover a:active などの設定方法が不明です。 注:jQueryは使わない前提とします。 2.擬似クラスを設定する 調べるとい

  • 第8回 配列の取り扱い方

    配列の落とし穴 すでに述べたように、たとえ要素数を指定して配列を宣言しても、配列には後から要素を追加できる。また、配列のインデックスは0番から順に並んでいるとは限らない(途中が抜けている場合もある)。さらには、lengthプロパティで取得できる値は配列の要素数を表しているわけではないことにも注意が必要だ。 以下の例で見てみよう。 var a: Array<number> = new Array( 3 ); a[0] = 0; a[1] = 10; a[10] = 100;  // 10番というインデックスは範囲外のはずなのに…… a[20] = 200;  // 要素数は3のはずなのに…… alert( "2番は" + a[2] + "、10番は" + a[10] + "、配列のサイズは" + a.length ); 実行結果はどうなるだろう。a[2]という要素は存在しないので「undef

    第8回 配列の取り扱い方
    s_hiiragi
    s_hiiragi 2018/06/28
    “lengthプロパティで取得できる値は配列の要素数を表しているわけではないことにも注意が必要だ。”
  • でもやっぱりfor文は使っていいと思うよ - Qiita

    Register as a new user and use Qiita more conveniently You get articles that match your needsYou can efficiently read back useful informationWhat you can do with signing up

    でもやっぱりfor文は使っていいと思うよ - Qiita
    s_hiiragi
    s_hiiragi 2018/04/12
    map,filter,reduceがジェネレータを返すようになったら速くなったりしないだろうか
  • var,let,constの違いは、ブロックスコープと巻き上げ - 30歳からのプログラミング

    JavaScriptにおける変数宣言はvarによって行われてきたが、ES2015で、letとconstが加わった。 varとの違いは、ブロックスコープを作るということと、変数の巻き上げの挙動が異なる、ということである。 このことについて、varとletを比較することで説明していく。constについては最後に触れる。 ブロックスコープ これまでのJavaScriptでは、スコープをつくるのは、 グローバルスコープ ローカルスコープ evalスコープ の3つのみであった。 スコープについては以下を参照。 スコープとクロージャ {}で囲まれている領域をブロックと呼ぶが、これはスコープは作らなかった。そのため、ifやforはスコープを持たなかった。 var x = 0; console.log(x); // 0 if(true){ var x = 1; console.log(x); // 1 }

    var,let,constの違いは、ブロックスコープと巻き上げ - 30歳からのプログラミング
  • JavaScript - MDC

    JavaScript チュートリアル 初級編 JavaScript の基礎 JavaScript の第一歩 JavaScript の構成要素 JavaScript オブジェクト入門 JavaScript ガイド 入門編 文法とデータ型 制御フローとエラー処理 ループとイテレーター 関数 式と演算子 数と日付 テキスト処理 正規表現 インデックス付きコレクション キー付きコレクション オブジェクトを利用する Using classes プロミスの使用 JavaScript 型付き配列 イテレーターとジェネレーター メタプログラミング JavaScript モジュール 中級編 クライアントサイド JavaScript フレームワーク クライアントサイド Web API Language overview JavaScript のデータ構造 等値比較と同一性 プロパティの列挙可能性と所有権 クロ

    JavaScript - MDC
  • Use JSDoc: @type

    Table of Contents Syntax Overview Examples Related Links Syntax @type {typeName} Overview The @type tag allows you to provide a type expression identifying the type of value that a symbol may contain, or the type of value returned by a function. You can also include type expressions with many other JSDoc tags, such as the @param tag. A type expression can include the JSDoc namepath to a symbol (fo

  • そのコードが標準化されてるJavaScriptなのかを判定する方法

    ECMAScript Version Detector ECMAScript Version Detectorというツールとライブラリを書きました。 azu.github.io/ecmascript-version-detector/へアクセスして、好きなコードをペーストすると、そのコードの構文がECMAScriptのどのバージョンから使える機能なのかを表示してくれます。 たとえば、以下のコードはasyncとawaitの部分がまだProposalであるAsync Functionsであることを検出してくれたりします。 目的 Babelなどの変換ツールでECMAScriptのProposalな機能などが身近になりました。 しかし、それがまだ仕様に入ってないもの(Proposal段階であるもの)ということを意識しないで書いてる人もよく見かけるようになりました。 そのため、まだProposalの

    そのコードが標準化されてるJavaScriptなのかを判定する方法
    s_hiiragi
    s_hiiragi 2017/09/20
    他の言語でも欲しい
  • JavaScript における文字列置換 (String#replace メソッド) - vivid memo

    JavaScript において文字列の置換 (文字列中のある部分文字列を別の文字列に変換する) を行うためには String#replace メソッドを使用します。 // 第 1 引数が置換対象の文字列, 第 2 引数が置換後の文字列 window.alert( "test".replace("t", "a") ); // => "aest" と表示 ここで、最初の "t" は "a" に置換されていますが、2 番目の "t" は置換されていません。 これは、デフォルトでは String#replace メソッドは最初にマッチしたものしか置換しないためです。 該当する文字全てを置換したい場合は、第 3 引数に "g" を渡す方法 (これは ECMAScript の仕様にはない模様. JavaScript や JScript の独自拡張ぽい) や、第 1 引数を g フラグ付きの RegEx

    JavaScript における文字列置換 (String#replace メソッド) - vivid memo
  • querySelector(All)のレシーバは、セレクタのコンテキストには影響を与えない - rikubaのブログ

    <ul id="list"> <li>階層1</li> <li>階層1 <ul> <li>階層2</li> <li>階層2</li> </ul> </li> </ul> <script> var list = document.getElementById('list'); var lis = list.querySelectorAll('ul li'); </script> 変数lisには階層2のli要素だけが含まれると思っていたが、実際には階層1のli要素も含まれてしまう。 querySelector、querySelectorAllは、レシーバの要素を基準にしてセレクタにマッチする要素を探し出すのではなく、まず文書からセレクタに一致する要素を探し出し、その中からレシーバの要素の子孫にあたる要素だけを選び出すようだ。 期待していた結果をjQueryで例えると... $('#list')

    querySelector(All)のレシーバは、セレクタのコンテキストには影響を与えない - rikubaのブログ