diff options
Diffstat (limited to 'files/zh-cn/web/javascript/reference/operators')
14 files changed, 0 insertions, 1987 deletions
diff --git a/files/zh-cn/web/javascript/reference/operators/相加/index.html b/files/zh-cn/web/javascript/reference/operators/addition/index.html index 6da432b4e6..6da432b4e6 100644 --- a/files/zh-cn/web/javascript/reference/operators/相加/index.html +++ b/files/zh-cn/web/javascript/reference/operators/addition/index.html diff --git a/files/zh-cn/web/javascript/reference/operators/arithmetic_operators/index.html b/files/zh-cn/web/javascript/reference/operators/arithmetic_operators/index.html deleted file mode 100644 index 917ac03b06..0000000000 --- a/files/zh-cn/web/javascript/reference/operators/arithmetic_operators/index.html +++ /dev/null @@ -1,302 +0,0 @@ ---- -title: 算术运算符 -slug: Web/JavaScript/Reference/Operators/Arithmetic_Operators -tags: - - JavaScript - - Operator -translation_of: Web/JavaScript/Reference/Operators -translation_of_original: Web/JavaScript/Reference/Operators/Arithmetic_Operators ---- -<div>{{jsSidebar("Operators")}}</div> - -<p><strong>算术运算符</strong>以数值(字面量或变量)作为其操作数,并返回一个单个数值。标准算术运算符是加法(+),减法(-),乘法(*)和除法(/)。</p> - -<div>{{EmbedInteractiveExample("pages/js/expressions-arithmetic.html")}}</div> - - - -<h2 id="加法">加法 (+)</h2> - -<p>加法运算符的作用是数值求和,或者字符串拼接。</p> - -<h3 id="语法">语法</h3> - -<pre class="syntaxbox notranslate"><strong>运算符:</strong> x + y -</pre> - -<h3 id="示例">示例</h3> - -<pre class="brush: js notranslate">// Number + Number -> 数字相加 -1 + 2 // 3 - -// Boolean + Number -> 数字相加 -true + 1 // 2 - -// Boolean + Boolean -> 数字相加 -false + false // 0 - -// Number + String -> 字符串连接 -5 + "foo" // "5foo" - -// String + Boolean -> 字符串连接 -"foo" + false // "foofalse" - -// String + String -> 字符串连接 -"foo" + "bar" // "foobar" -</pre> - -<h2 id="减法_-">减法 (-)</h2> - -<p>减法运算符使两个操作数相减,结果是它们的差值。</p> - -<h3 id="语法_2">语法</h3> - -<pre class="syntaxbox notranslate"><strong>运算符:</strong> x - y -</pre> - -<h3 id="示例_2">示例</h3> - -<pre class="brush: js notranslate">5 - 3 // 2 -3 - 5 // -2 -"foo" - 3 // NaN</pre> - -<h2 id="除法">除法 (/)</h2> - -<p>除法运算符的结果是操作数的商 ,左操作数是被除数,右操作数是除数。</p> - -<h3 id="语法_3">语法</h3> - -<pre class="syntaxbox notranslate"><strong>运算符:</strong> x / y -</pre> - -<h3 id="示例_3">示例</h3> - -<pre class="brush: js notranslate">1 / 2 // 在 JavaScript 中返回 0.5 -1 / 2 // 在 Java 中返回 0 -// (不需要数字是明确的浮点数) - -1.0 / 2.0 // 在 JavaScript 或 Java 中都返回 0.5 - -2.0 / 0 // 在 JavaScript 中返回 Infinity -2.0 / 0.0 // 同样返回 Infinity -2.0 / -0.0 // 在 JavaScript 中返回 -Infinity</pre> - -<h2 id="乘法_*">乘法 (*)</h2> - -<p>乘法运算符的结果是操作数的乘积。</p> - -<h3 id="语法_4">语法</h3> - -<pre class="syntaxbox notranslate"><strong>运算符:</strong> x * y -</pre> - -<h3 id="示例_4">示例</h3> - -<pre class="brush: js notranslate">2 * 2 // 4 --2 * 2 // -4 -Infinity * 0 // NaN -Infinity * Infinity // Infinity -"foo" * 2 // NaN -</pre> - -<h2 id="求余">求余 (%)</h2> - -<p>求余运算符返回第一个操作数对第二个操作数的模,即 <code>var1</code> 对 <code>var2</code> 取模,其中 <code>var1</code> 和 <code>var2</code> 是变量。取模功能就是 <code>var1</code> 除以 <code>var2</code> 的整型余数。</p> - -<h3 id="语法_5">语法</h3> - -<pre class="syntaxbox notranslate"><strong>运算符:</strong> var1 % var2 -</pre> - -<h3 id="示例_5">示例</h3> - -<pre class="brush: js notranslate">12 % 5 // 2 --1 % 2 // -1 -NaN % 2 // NaN -1 % 2 // 1 -2 % 3 // 2 --4 % 2 // -0 -5.5 % 2 // 1.5 -</pre> - -<h2 id="幂_**">幂 (**)</h2> - -<p>幂运算符返回第一个操作数做底数,第二个操作数做指数的乘方。即,<code>var1</code><sup><code>var2</code></sup>,其中 <code>var1</code> 和 <code>var2</code> 是其两个操作数。幂运算符是右结合的。<code>a ** b ** c</code> 等同于 <code>a ** (b ** c)</code>。</p> - -<h3 id="语法_6">语法</h3> - -<pre class="syntaxbox notranslate"><strong>运算符:</strong> var1 ** var2 -</pre> - -<h3 id="注解">注解</h3> - -<p>包括 PHP 或 Python 等的大多数语言中,都包含幂运算符(一般来说符号是 ^ 或者 **)。这些语言中的幂运算符有着比其他的单目运算符(如一元 + 或一元 - )更高的优先级。但是作为例外,在 Bash 中,** 运算符被设计为比单目运算符优先级更低。在最新的 JavaScript(ES2016) 中,禁止使用带歧义的幂运算表达式。比如,底数前不能紧跟一元运算符(<code>+/-/~/!/delete/void/typeof</code>)。</p> - -<pre class="brush: js notranslate">-2 ** 2; -// 在 Bash 中等于 4 ,而在其他语言中一般等于 -4 -// 在 JavaScript 中是错误的,因为这会有歧义 - --(2 ** 2); -// -4 在 JavaScript 中能够明显体现出作者的意图</pre> - -<h3 id="示例_6">示例</h3> - -<pre class="brush: js notranslate">2 ** 3 // 8 -3 ** 2 // 9 -3 ** 2.5 // 15.588457268119896 -10 ** -1 // 0.1 -NaN ** 2 // NaN - -2 ** 3 ** 2 // 512 -2 ** (3 ** 2) // 512 -(2 ** 3) ** 2 // 64 -</pre> - -<p>如果要反转求幂表达式结果的符号,你可以采用这样的方式:</p> - -<pre class="brush: js notranslate">-(2 ** 2) // -4</pre> - -<p>强制求幂表达式的基数为负数:</p> - -<pre class="brush: js notranslate">(-2) ** 2 // 4</pre> - -<h2 id="递增">递增 (++)</h2> - -<p>递增运算符为其操作数增加1,返回一个数值。</p> - -<ul> - <li>如果使用后置(postfix),即运算符位于操作数的后面(如 x++),那么将会在递增前返回数值。</li> - <li>如果使用前置(prefix),即运算符位于操作数的前面(如 ++x),那么将会在递增后返回数值。</li> -</ul> - -<h3 id="语法_7">语法</h3> - -<pre class="syntaxbox notranslate"><strong>运算符:</strong> x++ 或者 ++x -</pre> - -<h3 id="示例_7">示例</h3> - -<pre class="brush: js notranslate">// 后置 -var x = 3; -y = x++; -// y = 3, x = 4 - -// 前置 -var a = 2; -b = ++a; -// a = 3, b = 3 -</pre> - -<h2 id="递减_--">递减 (--)</h2> - -<p>递减运算符将其操作数减去1,并返回一个数值。</p> - -<ul> - <li>如果后置使用(如 x--),则在递减前返回数值。</li> - <li>如果前置使用(如 --x),则在递减后返回数值。</li> -</ul> - -<h3 id="语法_8">语法</h3> - -<pre class="syntaxbox notranslate"><strong>运算符:</strong> x-- or --x -</pre> - -<h3 id="示例_8">示例</h3> - -<pre class="brush: js notranslate">// 后置 -var x = 3; -y = x--; // y = 3, x = 2 - -// 前置 -var a = 2; -b = --a; // a = 1, b = 1 -</pre> - -<h2 id="一元负号_-">一元负号 (-)</h2> - -<p>一元负号运算符位于操作数前面,并转换操作数的符号。</p> - -<h3 id="语法_9">语法</h3> - -<pre class="syntaxbox notranslate"><strong>运算符:</strong> -x -</pre> - -<h3 id="示例_9">示例</h3> - -<pre class="brush: js notranslate">var x = 3; -y = -x; // y = -3, x = 3 -</pre> - -<h2 id="一元正号">一元正号 (+)</h2> - -<p>一元正号运算符位于其操作数前面,计算其操作数的数值,如果操作数不是一个数值,会尝试将其转换成一个数值。 尽管一元负号也能转换非数值类型,但是一元正号是转换其他对象到数值的最快方法,也是最推荐的做法,因为它不会对数值执行任何多余操作。它可以将字符串转换成整数和浮点数形式,也可以转换非字符串值 <code>true</code>,<code>false</code> <code>和</code> <code>null</code>。小数和十六进制格式字符串也可以转换成数值。负数形式字符串也可以转换成数值(对于十六进制不适用)。如果它不能解析一个值,则计算结果为 <a href="/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/NaN">NaN</a>。</p> - -<h3 id="语法_10">语法</h3> - -<pre class="syntaxbox notranslate"><strong>运算符:</strong> +x -</pre> - -<h3 id="示例_10">示例</h3> - -<pre class="brush: js notranslate">+3 // 3 -+"3" // 3 -+true // 1 -+false // 0 -+null // 0 -+function(val){ return val;} //NaN</pre> - -<h2 id="规范">规范</h2> - -<table class="standard-table"> - <tbody> - <tr> - <th scope="col">Specification</th> - <th scope="col">Status</th> - <th scope="col">Comment</th> - </tr> - <tr> - <td>{{SpecName('ES1')}}</td> - <td>{{Spec2('ES1')}}</td> - <td>Initial definition.</td> - </tr> - <tr> - <td>{{SpecName('ES5.1', '#sec-11.3')}}</td> - <td>{{Spec2('ES5.1')}}</td> - <td>Defined in several sections of the specification: <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.6">Additive operators</a>, <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.5">Multiplicative operators</a>, <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.3">Postfix expressions</a>, <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.4">Unary operators</a>.</td> - </tr> - <tr> - <td>{{SpecName('ES2015', '#sec-postfix-expressions')}}</td> - <td>{{Spec2('ES2015')}}</td> - <td>Defined in several sections of the specification: <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-additive-operators">Additive operators</a>, <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-multiplicative-operators">Multiplicative operators</a>, <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-postfix-expressions">Postfix expressions</a>, <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-unary-operators">Unary operators</a>.</td> - </tr> - <tr> - <td>{{SpecName('ES2016', '#sec-postfix-expressions')}}</td> - <td>{{Spec2('ES2016')}}</td> - <td>Added <a href="https://github.com/rwaldron/exponentiation-operator">Exponentiation operator</a>.</td> - </tr> - <tr> - <td>{{SpecName('ES2017', '#sec-postfix-expressions')}}</td> - <td>{{Spec2('ES2017')}}</td> - <td></td> - </tr> - <tr> - <td>{{SpecName('ESDraft', '#sec-additive-operators')}}</td> - <td>{{Spec2('ESDraft')}}</td> - <td></td> - </tr> - </tbody> -</table> - -<h2 id="浏览器兼容性">浏览器兼容性</h2> - -<div class="hidden"> -<p>The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p> -</div> - -<p>{{Compat("javascript.operators.arithmetic")}}</p> - -<h2 id="相关链接">相关链接</h2> - -<ul> - <li><a href="/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators">赋值运算符</a></li> -</ul> diff --git a/files/zh-cn/web/javascript/reference/operators/assignment_operators/index.html b/files/zh-cn/web/javascript/reference/operators/assignment_operators/index.html deleted file mode 100644 index 66ae471cde..0000000000 --- a/files/zh-cn/web/javascript/reference/operators/assignment_operators/index.html +++ /dev/null @@ -1,413 +0,0 @@ ---- -title: 赋值运算符 -slug: Web/JavaScript/Reference/Operators/Assignment_Operators -tags: - - JavaScript - - 运算符 -translation_of: Web/JavaScript/Reference/Operators#Assignment_operators -translation_of_original: Web/JavaScript/Reference/Operators/Assignment_Operators ---- -<div>{{jsSidebar("Operators")}}</div> - -<p>赋值运算符(<strong>assignment operator</strong>)基于右值(right operand)的值,给左值(left operand)赋值。</p> - -<div>{{EmbedInteractiveExample("pages/js/expressions-assignment.html")}}</div> - -<p class="hidden">本文的交互示例的源代码存储在GithHub仓库。如果你愿意贡献更多交互示例,请克隆仓库 <a href="https://github.com/mdn/interactive-examples">https://github.com/mdn/interactive-examples</a> 并提交 pull request.</p> - -<h2 id="概述">概述</h2> - -<p>基本的赋值运算符是等号(<code>=</code>),该运算符把它右边的运算值赋给左边。即,<code>x = y</code> 把 <code>y</code> 的值赋给 <code>x</code>。 其他的赋值运算符通常是标准运算符的简写形式,如下面的定义与示例。 </p> - -<table class="standard-table"> - <tbody> - <tr> - <th>名称</th> - <th>简写形式</th> - <th>含义</th> - </tr> - <tr> - <td><a href="#Assignment">赋值(Assignment)</a></td> - <td><code>x = y</code></td> - <td><code>x = y</code></td> - </tr> - <tr> - <td><a href="#Addition_assignment">加赋值(Addition assignment)</a></td> - <td><code>x += y</code></td> - <td><code>x = x + y</code></td> - </tr> - <tr> - <td><a href="#Subtraction_assignment">减赋值(Subtraction assignment)</a></td> - <td><code>x -= y</code></td> - <td><code>x = x - y</code></td> - </tr> - <tr> - <td><a href="#Multiplication_assignment">乘赋值(Multiplication assigment)</a></td> - <td><code>x *= y</code></td> - <td><code>x = x * y</code></td> - </tr> - <tr> - <td><a href="#Division_assignment">除赋值(Division assignment)</a></td> - <td><code>x /= y</code></td> - <td><code>x = x / y</code></td> - </tr> - <tr> - <td><a href="#Remainder_assignment">模赋值(Remainder assignment)</a></td> - <td><code>x %= y</code></td> - <td><code>x = x % y</code></td> - </tr> - <tr> - <td><a href="#Exponentiation_assignment">指数赋值(Exponentiation assignment)</a></td> - <td><code>x **= y</code></td> - <td><code>x = x ** y</code></td> - </tr> - <tr> - <td><a href="#Left_shift_assignment">左移赋值(Left shift assignment)</a></td> - <td><code>x <<= y</code></td> - <td><code>x = x << y</code></td> - </tr> - <tr> - <td><a href="#Right_shift_assignment">右移赋值(Right shift assignment)</a></td> - <td><code>x >>= y</code></td> - <td><code>x = x >> y</code></td> - </tr> - <tr> - <td><a href="#Unsigned_right_shift_assignment">无符号右移赋值(Unsigned right shift assignment)</a></td> - <td><code>x >>>= y</code></td> - <td><code>x = x >>> y</code></td> - </tr> - <tr> - <td><a href="#Bitwise_AND_assignment">按位与赋值(Bitwise AND assignment)</a></td> - <td><code>x &= y</code></td> - <td><code>x = x & y</code></td> - </tr> - <tr> - <td><a href="#Bitwise_XOR_assignment">按位异或赋值(Bitwise XOR assignment)</a></td> - <td><code>x ^= y</code></td> - <td><code>x = x ^ y</code></td> - </tr> - <tr> - <td><a href="#Bitwise_OR_assignment">按位或赋值(Bitwise OR assignment)</a></td> - <td><code>x |= y</code></td> - <td><code>x = x | y</code></td> - </tr> - </tbody> -</table> - -<h2 id="赋值"><a name="Assignment">赋值</a></h2> - -<p>简单的赋值运算符,把一个值赋给一个变量。为了把一个值赋给多个变量,可以以链式使用赋值运算符。参考下例:</p> - -<h4 id="语法">语法</h4> - -<pre class="syntaxbox"><strong>Operator:</strong> x = y -</pre> - -<h4 id="示例">示例</h4> - -<pre class="brush: js">// Assuming the following variables -// x = 5 -// y = 10 -// z = 25 - -x = y // x is 10 -x = y = z // x, y and z are all 25 -</pre> - -<h3 id="加赋值(Addition_assignment)"><a name="Addition_assignment">加赋值(Addition assignment)</a></h3> - -<p>加赋值运算符把一个右值与一个变量相加,然后把相加的结果赋给该变量。两个操作数的类型决定了加赋值运算符的行为。算术相加或字符串连接都有可能。更多细节参考 {{jsxref("Operators/Arithmetic_Operators", "addition operator", "#Addition", 1)}}。</p> - -<h4 id="语法_2">语法</h4> - -<pre class="syntaxbox"><strong>Operator:</strong> x += y -<strong>Meaning:</strong> x = x + y -</pre> - -<h4 id="示例_2">示例</h4> - -<pre class="brush: js">// 定义下列变量 -// foo = 'foo' -// bar = 5 -// baz = true - - -// Number + Number -> addition -bar += 2 // 7 - -// Boolean + Number -> addition -baz += 1 // 2 - -// Boolean + Boolean -> addition -baz += false // 1 - -// Number + String -> concatenation -bar += 'foo' // "5foo" - -// String + Boolean -> concatenation -foo += false // "foofalse" - -// String + String -> concatenation -foo += 'bar' // "foobar" -</pre> - -<h3 id="减赋值(Subtraction_assignment)"><a name="Subtraction_assignment">减赋值(Subtraction assignment)</a></h3> - -<p>减赋值运算符使一个变量减去右值,然后把结果赋给该变量。更多细节查看 {{jsxref("Operators/Arithmetic_Operators", "subtraction operator", "#Subtraction", 1)}} 。</p> - -<h4 id="语法_3">语法</h4> - -<pre class="syntaxbox"><strong>Operator:</strong> x -= y -<strong>Meaning:</strong> x = x - y -</pre> - -<h4 id="示例_3">示例</h4> - -<pre class="brush: js">// 假定已定义了下面的变量 -// bar = 5 - -bar -= 2 // 3 -bar -= "foo" // NaN -</pre> - -<h3 id="乘赋值(Multiplication_assignment)"><a name="Multiplication_assignment">乘赋值(Multiplication assignment)</a></h3> - -<p>乘赋值运算符使一个变量乘以右值,然后把相成的结果赋给该变量。更多细节查看 {{jsxref("Operators/Arithmetic_Operators", "multiplication operator", "#Multiplication", 1)}}。</p> - -<h4 id="语法_4">语法</h4> - -<pre class="syntaxbox"><strong>Operator:</strong> x *= y -<strong>Meaning:</strong> x = x * y -</pre> - -<h4 id="示例_4">示例</h4> - -<pre class="brush: js">// 假定已定义了下面的变量 -// bar = 5 - -bar *= 2 // 10 -bar *= 'foo' // NaN -</pre> - -<h3 id="除赋值(Division_assignment)"><a name="Division_assignment">除赋值(Division assignment)</a></h3> - -<p>除赋值运算符使一个变量除以右值,然后把结果赋给该变量。更多细节查看 {{jsxref("Operators/Arithmetic_Operators", "division operator", "#Division", 1)}}。</p> - -<h4 id="语法_5">语法</h4> - -<pre class="syntaxbox"><strong>Operator:</strong> x /= y -<strong>Meaning:</strong> x = x / y -</pre> - -<h4 id="示例_5">示例</h4> - -<pre class="brush: js">// 假定已定义了下面的变量 -// bar = 5 - -bar /= 2 // 2.5 -bar /= "foo" // NaN -bar /= 0 // Infinity -</pre> - -<h3 id="模赋值(Remainder_assignment)"><a name="Remainder_assignment">模赋值(Remainder assignment)</a></h3> - -<p>模赋值运算符使一个变量除以右值,然后把余数赋给该变量。更多细节查看 {{jsxref("Operators/Arithmetic_Operators", "remainder operator", "#Remainder", 1)}}。</p> - -<h4 id="语法_6">语法</h4> - -<pre class="syntaxbox"><strong>Operator:</strong> x %= y -<strong>Meaning:</strong> x = x % y -</pre> - -<h4 id="示例_6">示例</h4> - -<pre class="brush: js">// Assuming the following variable -// bar = 5 - -bar %= 2 // 1 -bar %= 'foo' // NaN -bar %= 0 // NaN -</pre> - -<h3 id="指数赋值(Exponentiation_assignment)"><a id="Exponentiation_assignment" name="Exponentiation_assignment">指数赋值(Exponentiation assignment)</a></h3> - -<p>指数赋值运算符使一个变量为底数、以右值为指数的指数运算(乘方)结果赋给该变量。更多细节查看 {{jsxref("Operators/Arithmetic_Operators", "算术运算符", "#Exponentiation", 1)}}。</p> - -<h4 id="语法_7">语法</h4> - -<pre class="syntaxbox"><strong>语法:</strong> x **= y -<strong>含义:</strong> x = x ** y -</pre> - -<h4 id="示例_7">示例</h4> - -<pre class="brush: js">// Assuming the following variable -// bar = 5 - -bar **= 2 // 25 -bar **= 'foo' // NaN</pre> - -<h3 id="左移赋值(Left_shift_assignment)"><a name="Left_shift_assignment">左移赋值(Left shift assignment)</a></h3> - -<p>左移赋值运算符使变量向左移动指定位数的比特位,然后把结果赋给该变量。更多细节查看 {{jsxref("Operators/Bitwise_Operators", "left shift operator", "#Left_shift", 1)}}。</p> - -<h4 id="语法_8">语法</h4> - -<pre class="syntaxbox"><strong>Operator:</strong> x <<= y -<strong>Meaning:</strong> x = x << y -</pre> - -<h4 id="示例_8">示例</h4> - -<pre class="brush: js">var bar = 5; // (00000000000000000000000000000101) -bar <<= 2; // 20 (00000000000000000000000000010100) -</pre> - -<h3 id="右移赋值(Right_shift_assignment)"><a name="Right_shift_assignment">右移赋值(Right shift assignment)</a></h3> - -<p>右移赋值运算符使变量向右移指定位数的比特位,然后把结果赋给该变量。更多细节查看 {{jsxref("Operators/Bitwise_Operators", "right shift operator", "#Right_shift", 1)}}。</p> - -<h4 id="语法_9">语法</h4> - -<pre class="syntaxbox"><strong>Operator:</strong> x >>= y -<strong>Meaning:</strong> x = x >> y -</pre> - -<h4 id="示例_9">示例</h4> - -<pre class="brush: js">var bar = 5; // (00000000000000000000000000000101) -bar >>= 2; // 1 (00000000000000000000000000000001) - -var bar = -5; // (-00000000000000000000000000000101) -bar >>= 2; // -2 (-00000000000000000000000000000010) -</pre> - -<h3 id="无符号右移赋值(Unsigned_right_shift_assignment)"><a name="Unsigned_right_shift_assignment">无符号右移赋值(Unsigned right shift assignment)</a></h3> - -<p>无符号右移赋值运算符向右移动指定数量的比特位,然后把结果赋给变量。更多细节查看 {{jsxref("Operators/Bitwise_Operators", " unsigned right shift operator", "#Unsigned_right_shift", 1)}}。</p> - -<h4 id="语法_10">语法</h4> - -<pre class="syntaxbox"><strong>Operator:</strong> x >>>= y -<strong>Meaning:</strong> x = x >>> y -</pre> - -<h4 id="示例_10">示例</h4> - -<pre class="brush: js">var bar = 5; // (00000000000000000000000000000101) -bar >>>= 2; // 1 (00000000000000000000000000000001) - -var bar = -5; // (-00000000000000000000000000000101) -bar >>>= 2; // 1073741822 (00111111111111111111111111111110)</pre> - -<h3 id="按位与赋值(Bitwise_AND_assignment)"><a name="Bitwise_AND_assignment">按位与赋值(Bitwise AND assignment)</a></h3> - -<p>按位与赋值运算符使用两个操作值的二进制表示,执行按位与运算,并把结果赋给变量。更多细节查看 {{jsxref("Operators/Bitwise_Operators", "bitwise AND operator", "#Bitwise_AND", 1)}}。</p> - -<h4 id="语法_11">语法</h4> - -<pre class="syntaxbox"><strong>Operator:</strong> x &= y -<strong>Meaning:</strong> x = x & y -</pre> - -<h4 id="示例_11">示例</h4> - -<pre class="brush: js">var bar = 5; -// 5: 00000000000000000000000000000101 -// 2: 00000000000000000000000000000010 -bar &= 2; // 0 -</pre> - -<h3 id="按位异或赋值(Bitwise_XOR_assignment)"><a name="Bitwise_XOR_assignment">按位异或赋值(Bitwise XOR assignment)</a></h3> - -<p>按位异或赋值运算符使用两个操作值的二进制表示,执行二进制异或运算,并把结果赋给变量。更多细节查看 {{jsxref("Operators/Bitwise_Operators", "bitwise XOR operator", "#Bitwise_XOR", 1)}}。</p> - -<h4 id="语法_12">语法</h4> - -<pre class="syntaxbox"><strong>Operator:</strong> x ^= y -<strong>Meaning:</strong> x = x ^ y -</pre> - -<h4 id="示例_12">示例</h4> - -<pre class="brush: js">var bar = 5; -bar ^= 2; // 7 -// 5: 00000000000000000000000000000101 -// 2: 00000000000000000000000000000010 -// ----------------------------------- -// 7: 00000000000000000000000000000111 -</pre> - -<h3 id="按位或赋值(Bitwise_OR_assignment)"><a name="Bitwise_OR_assignment">按位或赋值(Bitwise OR assignment)</a></h3> - -<p>按位或赋值运算符使用两个操作值的二进制表示,执行按位或运算,并把结果赋给变量。更多细节查看 {{jsxref("Operators/Bitwise_Operators", "bitwise OR operator", "#Bitwise_OR", 1)}}。</p> - -<h4 id="语法_13">语法</h4> - -<pre class="syntaxbox"><strong>Operator:</strong> x |= y -<strong>Meaning:</strong> x = x | y -</pre> - -<h4 id="示例_13">示例</h4> - -<pre class="brush: js">var bar = 5; -bar |= 2; // 7 -// 5: 00000000000000000000000000000101 -// 2: 00000000000000000000000000000010 -// ----------------------------------- -// 7: 00000000000000000000000000000111 -</pre> - -<h2 id="示例_14">示例</h2> - -<h3 id="带有赋值运算符的左值(Left_operand)">带有赋值运算符的左值(Left operand)</h3> - -<p>在某些不常见的情况下,赋值运算符(如<code> x += y</code>)并不等同于表达式( <code>x = x + y</code>)。当一个赋值运算符的左值包含有一个赋值运算符时,左值只会被求值一次。例如:</p> - -<pre class="brush: js">a[i++] += 5 // i 执行一次求值 -a[i++] = a[i++] + 5 // i 执行两次求值 -</pre> - -<h2 id="规范">规范</h2> - -<table class="standard-table"> - <tbody> - <tr> - <th scope="col">Specification</th> - <th scope="col">Status</th> - <th scope="col">Comment</th> - </tr> - <tr> - <td>{{SpecName('ESDraft', '#sec-assignment-operators', 'Assignment operators')}}</td> - <td>{{Spec2('ESDraft')}}</td> - <td></td> - </tr> - <tr> - <td>{{SpecName('ES2015', '#sec-assignment-operators', 'Assignment operators')}}</td> - <td>{{Spec2('ES2015')}}</td> - <td></td> - </tr> - <tr> - <td>{{SpecName('ES5.1', '#sec-11.13', 'Assignment operators')}}</td> - <td>{{Spec2('ES5.1')}}</td> - <td></td> - </tr> - <tr> - <td>{{SpecName('ES1', '#sec-11.13', 'Assignment operators')}}</td> - <td>{{Spec2('ES1')}}</td> - <td>Initial definition.</td> - </tr> - </tbody> -</table> - -<h2 id="浏览器兼容性">浏览器兼容性</h2> - -<div class="hidden">该兼容表是由结构化数据生成。如果你愿意贡献数据,请克隆仓库 <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> 并提交 pull request.</div> - -<p>{{Compat("javascript.operators.assignment")}}</p> - -<h2 id="相关链接">相关链接</h2> - -<ul> - <li><a href="/zh-CN/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators">算术运算符</a></li> -</ul> diff --git a/files/zh-cn/web/javascript/reference/operators/async允许声明一个函数为一个包含异步操作的函数/index.html b/files/zh-cn/web/javascript/reference/operators/async_function/index.html index eebfd13ca2..eebfd13ca2 100644 --- a/files/zh-cn/web/javascript/reference/operators/async允许声明一个函数为一个包含异步操作的函数/index.html +++ b/files/zh-cn/web/javascript/reference/operators/async_function/index.html diff --git a/files/zh-cn/web/javascript/reference/operators/按位与/index.html b/files/zh-cn/web/javascript/reference/operators/bitwise_and/index.html index 20eece2691..20eece2691 100644 --- a/files/zh-cn/web/javascript/reference/operators/按位与/index.html +++ b/files/zh-cn/web/javascript/reference/operators/bitwise_and/index.html diff --git a/files/zh-cn/web/javascript/reference/operators/bitwise_operators/index.html b/files/zh-cn/web/javascript/reference/operators/bitwise_operators/index.html deleted file mode 100644 index 4bdd7a1bc7..0000000000 --- a/files/zh-cn/web/javascript/reference/operators/bitwise_operators/index.html +++ /dev/null @@ -1,756 +0,0 @@ ---- -title: 按位操作符 -slug: Web/JavaScript/Reference/Operators/Bitwise_Operators -tags: - - js ^ & Bitwise Operators -translation_of: Web/JavaScript/Reference/Operators -translation_of_original: Web/JavaScript/Reference/Operators/Bitwise_Operators ---- -<div>{{jsSidebar("Operators")}}</div> - -<h2 id="Summary" name="Summary">概述</h2> - -<p><strong>按位操作符(Bitwise operators)</strong> 将其操作数(operands)当作32位的比特序列(由0和1组成),而不是十进制、十六进制或八进制<a href="/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number" title="/en-US/docs/JavaScript/Reference/Global_Objects/Number">数值</a>。例如,十进制数9,用二进制表示则为1001。按位操作符操作数字的二进制形式,但是返回值依然是标准的JavaScript数值。</p> - -<p>下面的表格总结了JavaScript中的按位操作符:</p> - -<table class="standard-table"> - <tbody> - <tr> - <th>运算符</th> - <th>用法</th> - <th>描述</th> - </tr> - <tr> - <td><a href="#Bitwise_AND">按位与( AND)</a></td> - <td style="white-space: nowrap;"><code>a & b</code></td> - <td>对于每一个比特位,只有两个操作数相应的比特位都是1时,结果才为1,否则为0。</td> - </tr> - <tr> - <td><a href="#Bitwise_OR">按位或(OR)</a></td> - <td style="white-space: nowrap;"><code>a | b</code></td> - <td>对于每一个比特位,当两个操作数相应的比特位至少有一个1时,结果为1,否则为0。</td> - </tr> - <tr> - <td><a href="#Bitwise_XOR">按位异或(XOR)</a></td> - <td style="white-space: nowrap;"><code>a ^ b</code></td> - <td>对于每一个比特位,当两个操作数相应的比特位有且只有一个1时,结果为1,否则为0。</td> - </tr> - <tr> - <td><a href="#Bitwise_NOT">按位非(NOT)</a></td> - <td style="white-space: nowrap;"><code>~ a</code></td> - <td>反转操作数的比特位,即0变成1,1变成0。</td> - </tr> - <tr> - <td><a href="#Left_shift">左移(L</a><a href="#Left_shift" style="line-height: 1.5;">eft shift)</a></td> - <td style="white-space: nowrap;"><code>a << b</code></td> - <td>将 <code>a</code> 的二进制形式向左移 <code>b</code> (< 32) 比特位,右边用0填充。</td> - </tr> - <tr> - <td><a href="#Right_shift">有符号右移</a></td> - <td style="white-space: nowrap;"><code>a >> b</code></td> - <td>将 a 的二进制表示向右移<code> b </code>(< 32) 位,丢弃被移出的位。</td> - </tr> - <tr> - <td><a href="#Unsigned_right_shift">无符号右移</a></td> - <td style="white-space: nowrap;"><code>a >>> b</code></td> - <td>将 a 的二进制表示向右移<code> b </code>(< 32) 位,丢弃被移出的位,并使用 0 在左侧填充。</td> - </tr> - </tbody> -</table> - -<h2 id="有符号32位整数">有符号32位整数</h2> - -<p>所有的按位操作符的操作数都会被转成补码(two's complement)形式的有符号32位整数。补码形式是指一个数的负对应值(negative counterpart)(如 5和-5)为数值的所有比特位反转后,再加1。反转比特位即该数值进行’非‘位运算,也即该数值的反码。例如下面为整数314的二进制编码:</p> - -<pre>00000000000000000000000100111010 -</pre> - -<p>下面编码 <code>~314</code>,即 <code>314</code> 的反码:</p> - -<pre>11111111111111111111111011000101 -</pre> - -<p>最后,下面编码 <code>-314</code>,即 <code>314</code> 的反码再加1:</p> - -<pre>11111111111111111111111011000110 -</pre> - -<p>补码保证了当一个数是正数时,其最左的比特位是0,当一个数是负数时,其最左的比特位是1。因此,最左边的比特位被称为符号位(<em>sign bit</em>)。</p> - -<p><code>0</code> 是所有比特数字0组成的整数。</p> - -<pre>0 (base 10) = 00000000000000000000000000000000 (base 2) -</pre> - -<p><code>-1</code> 是所有比特数字1组成的整数。</p> - -<pre>-1 (base 10) = 11111111111111111111111111111111 (base 2) -</pre> - -<p><code>-2147483648</code>(十六进制形式:<code>-0x80000000</code>)是除了最左边为1外,其他比特位都为0的整数。</p> - -<pre>-2147483648 (base 10) = 10000000000000000000000000000000 (base 2) -</pre> - -<p><code>2147483647</code>(十六进制形式:<code>0x7fffffff</code>)是除了最左边为0外,其他比特位都为1的整数。</p> - -<pre>2147483647 (base 10) = 01111111111111111111111111111111 (base 2) -</pre> - -<p>数字<code>-2147483648</code> 和 <code>2147483647</code> 是32位有符号数字所能表示的最小和最大整数。</p> - -<h2 id="按位逻辑操作符">按位逻辑操作符</h2> - -<p>从概念上讲,按位逻辑操作符按遵守下面规则:</p> - -<ul> - <li>操作数被转换成32位整数,用比特序列(0和1组成)表示。超过32位的数字会被丢弃。<br> - 例如, 以下具有32位以上的整数将转换为32位整数:</li> - <li> - <pre>转换前: 11100110111110100000000000000110000000000001 -转换后: 10100000000000000110000000000001</pre> - </li> - <li>第一个操作数的每个比特位与第二个操作数的相应比特位匹配:第一位对应第一位,第二位对应第二位,以此类推。</li> - <li>位运算符应用到每对比特位,结果是新的比特值。</li> -</ul> - -<h3 id="(按位与)"><a name="Bitwise_AND">& (按位与)</a></h3> - -<p>对每对比特位执行<strong>与(AND)操作</strong>。只有 a 和 b 都是 1 时,a AND b 才是 1。<strong>与操作</strong>的真值表如下:</p> - -<table class="standard-table"> - <tbody> - <tr> - <td class="header">a</td> - <td class="header">b</td> - <td class="header">a AND b</td> - </tr> - <tr> - <td>0</td> - <td>0</td> - <td>0</td> - </tr> - <tr> - <td>0</td> - <td>1</td> - <td>0</td> - </tr> - <tr> - <td>1</td> - <td>0</td> - <td>0</td> - </tr> - <tr> - <td>1</td> - <td>1</td> - <td>1</td> - </tr> - </tbody> -</table> - -<pre> 9 (base 10) = 00000000000000000000000000001001 (base 2) - 14 (base 10) = 00000000000000000000000000001110 (base 2) - -------------------------------- -14 & 9 (base 10) = 00000000000000000000000000001000 (base 2) = 8 (base 10) -</pre> - -<p>将任一数值 x 与 0 执行按位与操作,其结果都为 0。将任一数值 x 与 -1 执行按位与操作,其结果都为 x。</p> - -<h3 id="(按位或)"><a name="Bitwise_OR">| (按位或)</a></h3> - -<p>对每一对比特位执行<strong>或(OR)操作</strong>。如果 a 或 b 为 1,则 <code>a</code> OR <code>b</code> 结果为 1。<strong>或操作</strong>的真值表:</p> - -<table class="standard-table"> - <tbody> - <tr> - <td class="header">a</td> - <td class="header">b</td> - <td class="header">a OR b</td> - </tr> - <tr> - <td>0</td> - <td>0</td> - <td>0</td> - </tr> - <tr> - <td>0</td> - <td>1</td> - <td>1</td> - </tr> - <tr> - <td>1</td> - <td>0</td> - <td>1</td> - </tr> - <tr> - <td>1</td> - <td>1</td> - <td>1</td> - </tr> - </tbody> -</table> - -<pre> 9 (base 10) = 00000000000000000000000000001001 (base 2) - 14 (base 10) = 00000000000000000000000000001110 (base 2) - -------------------------------- -14 | 9 (base 10) = 00000000000000000000000000001111 (base 2) = 15 (base 10) -</pre> - -<p>将任一数值 x 与 0 进行按位或操作,其结果都是 x。将任一数值 x 与 -1 进行按位或操作,其结果都为 -1。</p> - -<p>补充一些例子:</p> - -<pre class="brush: js">1 | 0 ; // 1 - -1.1 | 0 ; // 1 - -'asfdasfda' | 0 ; // 0 - -0 | 0 ; // 0 - -(-1) | 0 ; // -1 - -(-1.5646) | 0 ; // -1 - -[] | 0 ; // 0 - -({}) | 0 ; // 0 - -"123456" | 0 ; // 123456 - -1.23E2 | 0; // 123 - -1.23E12 | 0; // 1639353344 - --1.23E2 | 0; // -123 - --1.23E12 | 0; // -1639353344</pre> - -<h3 id="(按位异或)"><a name="Bitwise_XOR">^ (按位异或)</a></h3> - -<p>对每一对比特位执行<strong>异或(XOR)操作</strong>。当 a 和 b 不相同时,<code>a</code> XOR <code>b</code> 的结果为 1。<strong>异或操作</strong>真值表:</p> - -<table class="standard-table"> - <tbody> - <tr> - <td class="header">a</td> - <td class="header">b</td> - <td class="header">a XOR b</td> - </tr> - <tr> - <td>0</td> - <td>0</td> - <td>0</td> - </tr> - <tr> - <td>0</td> - <td>1</td> - <td>1</td> - </tr> - <tr> - <td>1</td> - <td>0</td> - <td>1</td> - </tr> - <tr> - <td>1</td> - <td>1</td> - <td>0</td> - </tr> - </tbody> -</table> - -<pre> 9 (base 10) = 00000000000000000000000000001001 (base 2) - 14 (base 10) = 00000000000000000000000000001110 (base 2) - -------------------------------- -14 ^ 9 (base 10) = 00000000000000000000000000000111 (base 2) = 7 (base 10) -</pre> - -<p>将任一数值 x 与 0 进行异或操作,其结果为 x。将任一数值 x 与 -1 进行异或操作,其结果为 ~x。</p> - -<h3 id="(按位非)"><a name="Bitwise_NOT">~ (按位非)</a></h3> - -<p>对每一个比特位执行<strong>非(NOT)操作</strong>。NOT <code>a</code> 结果为 a 的反转(即反码)。<strong>非操作</strong>的真值表:</p> - -<table class="standard-table"> - <tbody> - <tr> - <td class="header">a</td> - <td class="header">NOT a</td> - </tr> - <tr> - <td>0</td> - <td>1</td> - </tr> - <tr> - <td>1</td> - <td>0</td> - </tr> - </tbody> -</table> - -<pre> 9 (base 10) = 00000000000000000000000000001001 (base 2) - -------------------------------- -~9 (base 10) = 11111111111111111111111111110110 (base 2) = -10 (base 10) -</pre> - -<p>对任一数值 x 进行按位非操作的结果为 -(x + 1)。例如,~5 结果为 -6。</p> - -<p>与 indexOf 一起使用示例:</p> - -<pre class="brush: js">var str = 'rawr'; -var searchFor = 'a'; - -// 这是 if (-1*str.indexOf('a') <= 0) 条件判断的另一种方法 -if (~str.indexOf(searchFor)) { - // searchFor 包含在字符串中 -} else { - // searchFor 不包含在字符串中 -} - -// (~str.indexOf(searchFor))的返回值 -// r == -1 -// a == -2 -// w == -3 -</pre> - -<h2 id="按位移动操作符">按位移动操作符</h2> - -<p>按位移动操作符有两个操作数:第一个是要被移动的数字,而第二个是要移动的长度。移动的方向根据操作符的不同而不同。</p> - -<p>按位移动会先将操作数转换为大端字节序顺序(big-endian order)的32位整数,并返回与左操作数相同类型的结果。右操作数应小于 32位,否则只有最低 5 个字节会被使用。</p> - -<pre>注:Big-Endian:高位字节排放在内存的低地址端,低位字节排放在内存的高地址端, -又称为"高位编址"。 -Big-Endian是最直观的字节序: -①把内存地址从左到右按照由低到高的顺序写出; -②把值按照通常的高位到低位的顺序写出; -③两者对照,一个字节一个字节的填充进去。</pre> - -<h3 id="<<_(左移)"><a name="Left_shift"><< (左移)</a></h3> - -<p>该操作符会将第一个操作数向左移动指定的位数。向左被移出的位被丢弃,右侧用 0 补充。</p> - -<p>For example, <code>9 << 2</code> yields 36:</p> - -<pre> 9 (base 10): 00000000000000000000000000001001 (base 2) - -------------------------------- -9 << 2 (base 10): 00000000000000000000000000100100 (base 2) = 36 (base 10) -</pre> - -<p>在数字 <strong>x</strong> 上左移 <strong>y</strong> 比特得到 <strong>x * 2<sup>y</sup></strong>.</p> - -<h3 id=">>_(有符号右移)"><a name="Right_shift">>> (有符号右移)</a></h3> - -<p>该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,拷贝最左侧的位以填充左侧。由于新的最左侧的位总是和以前相同,符号位没有被改变。所以被称作“符号传播”。</p> - -<p>例如, <code>9 >> 2</code> 得到 2:</p> - -<pre> 9 (base 10): 00000000000000000000000000001001 (base 2) - -------------------------------- -9 >> 2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10) -</pre> - -<p>相比之下, <code>-9 >> 2</code> 得到 -3,因为符号被保留了。</p> - -<pre> -9 (base 10): 11111111111111111111111111110111 (base 2) - -------------------------------- --9 >> 2 (base 10): 11111111111111111111111111111101 (base 2) = -3 (base 10) -</pre> - -<h3 id=">>>_(无符号右移)"><a name="Unsigned_right_shift">>>> (无符号右移)</a></h3> - -<p>该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,左侧用0填充。因为符号位变成了 0,所以结果总是非负的。(译注:即便右移 0 个比特,结果也是非负的。)</p> - -<p>对于非负数,有符号右移和无符号右移总是返回相同的结果。例如 <code>9 >>> 2</code> 和 <code>9 >> 2</code> 一样返回 2:</p> - -<pre> 9 (base 10): 00000000000000000000000000001001 (base 2) - -------------------------------- -9 >>> 2 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10) -</pre> - -<p>但是对于负数却不尽相同。 <code>-9 >>> 2</code> 产生 1073741821 这和 <code>-9 >> 2</code> 不同:</p> - -<pre> -9 (base 10): 11111111111111111111111111110111 (base 2) - -------------------------------- --9 >>> 2 (base 10): 00111111111111111111111111111101 (base 2) = 1073741821 (base 10) -</pre> - -<h2 id="示例">示例</h2> - -<h3 id="例子:标志位与掩码">例子:标志位与掩码</h3> - -<p>位运算经常被用来创建、处理以及读取标志位序列——一种类似二进制的变量。虽然可以使用变量代替标志位序列,但是这样可以节省内存(1/32)。</p> - -<p>例如,有 4 个标志位:</p> - -<ul> - <li>标志位 A:我们有 ant</li> - <li>标志位 B:我们有 bat</li> - <li>标志位 C:我们有 cat</li> - <li>标志位 D:我们有 duck</li> -</ul> - -<p>标志位通过位序列 DCBA 来表示。当一个位被置位 (set) 时,它的值为 1 。当被清除 (clear) 时,它的值为 0 。例如一个变量 <code>flags</code> 的二进制值为 0101:</p> - -<pre class="brush: js">var flags = 5; // 二进制 0101 -</pre> - -<p>这个值表示:</p> - -<ul> - <li>标志位 A 是 true (我们有 ant);</li> - <li>标志位 B 是 false (我们没有 bat);</li> - <li>标志位 C 是 true (我们有 cat);</li> - <li>标志位 D 是 false (我们没有 duck);</li> -</ul> - -<p>因为位运算是 32 位的, 0101 实际上是 00000000000000000000000000000101。因为前面多余的 0 没有任何意义,所以他们可以被忽略。</p> - -<p>掩码 (bitmask) 是一个通过与/或来读取标志位的位序列。典型的定义每个标志位的原语掩码如下:</p> - -<pre class="brush: js">var FLAG_A = 1; // 0001 -var FLAG_B = 2; // 0010 -var FLAG_C = 4; // 0100 -var FLAG_D = 8; // 1000 -</pre> - -<p>新的掩码可以在以上掩码上使用逻辑运算创建。例如,掩码 1011 可以通过 FLAG_A、FLAG_B 和 FLAG_D 逻辑或得到:</p> - -<pre class="brush: js">var mask = FLAG_A | FLAG_B | FLAG_D; // 0001 | 0010 | 1000 => 1011 -</pre> - -<p>某个特定的位可以通过与掩码做逻辑与运算得到,通过与掩码的与运算可以去掉无关的位,得到特定的位。例如,掩码 0100 可以用来检查标志位 C 是否被置位:</p> - -<pre class="brush: js">// 如果我们有 cat -if (flags & FLAG_C) { // 0101 & 0100 => 0100 => true - // do stuff -} -</pre> - -<p>一个有多个位被置位的掩码表达任一/或者的含义。例如,以下两个表达是等价的:</p> - -<pre class="brush: js">// 如果我们有 bat 或者 cat 至少一个 -// (0101 & 0010) || (0101 & 0100) => 0000 || 0100 => true -if ((flags & FLAG_B) || (flags & FLAG_C)) { - // do stuff -} -</pre> - -<pre class="brush: js">// 如果我们有 bat 或者 cat 至少一个 -var mask = FLAG_B | FLAG_C; // 0010 | 0100 => 0110 -if (flags & mask) { // 0101 & 0110 => 0100 => true - // do stuff -} -</pre> - -<p>可以通过与掩码做或运算设置标志位,掩码中为 1 的位可以设置对应的位。例如掩码 1100 可用来设置位 C 和 D:</p> - -<pre class="brush: js">// 我们有 cat 和 duck -var mask = FLAG_C | FLAG_D; // 0100 | 1000 => 1100 -flags |= mask; // 0101 | 1100 => 1101 -</pre> - -<p>可以通过与掩码做与运算清除标志位,掩码中为 0 的位可以设置对应的位。掩码可以通过对原语掩码做非运算得到。例如,掩码 1010 可以用来清除标志位 A 和 C :</p> - -<pre class="brush: js">// 我们没有 ant 也没有 cat -var mask = ~(FLAG_A | FLAG_C); // ~0101 => 1010 -flags &= mask; // 1101 & 1010 => 1000 -</pre> - -<p>如上的掩码同样可以通过 <code>~FLAG_A & ~FLAG_C</code> 得到(德摩根定律):</p> - -<pre class="brush: js">// 我们没有 ant 也没有 cat -var mask = ~FLAG_A & ~FLAG_C; -flags &= mask; // 1101 & 1010 => 1000 -</pre> - -<p>标志位可以使用异或运算切换。所有值为 1 的位可以切换对应的位。例如,掩码 0110 可以用来切换标志位 B 和 C:</p> - -<pre class="brush: js">// 如果我们以前没有 bat ,那么我们现在有 bat -// 但是如果我们已经有了一个,那么现在没有了 -// 对 cat 也是相同的情况 -var mask = FLAG_B | FLAG_C; -flags = flags ^ mask; // 1100 ^ 0110 => 1010 -</pre> - -<p>最后,所有标志位可以通过非运算翻转:</p> - -<pre class="brush: js">// entering parallel universe... -flags = ~flags; // ~1010 => 0101 -</pre> - -<h3 id="转换片段">转换片段</h3> - -<p>将一个二进制数的 <code><a href="/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String" title="/en-US/docs/JavaScript/Reference/Global_Objects/String">String</a></code> 转换为十进制的 <code><a href="/zh-CN/docs/JavaScript/Reference/Global_Objects/Number" title="/en-US/docs/JavaScript/Reference/Global_Objects/Number">Number</a></code>:</p> - -<pre class="brush: js">var sBinString = "1011"; -var nMyNumber = parseInt(sBinString, 2); -alert(nMyNumber); // 打印 11 -</pre> - -<p>将一个十进制的 <code><a href="/zh-CN/docs/JavaScript/Reference/Global_Objects/Number" title="/en-US/docs/JavaScript/Reference/Global_Objects/Number">Number</a></code> 转换为二进制数的 <code><a href="/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String" title="/en-US/docs/JavaScript/Reference/Global_Objects/String">String</a></code>:</p> - -<pre class="brush: js">var nMyNumber = 11; -var sBinString = nMyNumber.toString(2); -alert(sBinString); // 打印 1011 -</pre> - -<h3 id="自动化掩码创建">自动化掩码创建</h3> - -<p>如果你需要从一系列的 <code><a href="/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Boolean" title="/en-US/docs/JavaScript/Reference/Global_Objects/Boolean">Boolean</a></code> 值创建一个掩码,你可以:</p> - -<pre class="brush: js">function createMask () { - var nMask = 0, nFlag = 0, nLen = arguments.length > 32 ? 32 : arguments.length; - for (nFlag; nFlag < nLen; nMask |= arguments[nFlag] << nFlag++); - return nMask; -} -var mask1 = createMask(true, true, false, true); // 11, i.e.: 1011 -var mask2 = createMask(false, false, true); // 4, i.e.: 0100 -var mask3 = createMask(true); // 1, i.e.: 0001 -// etc. - -alert(mask1); // 打印 11 -</pre> - -<h3 id="逆算法:从掩码得到布尔数组">逆算法:从掩码得到布尔数组</h3> - -<p>如果你希望从掩码得到得到 <code><a href="/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Boolean" title="/en-US/docs/JavaScript/Reference/Global_Objects/Boolean">Boolean</a></code> <code><a href="/zh-CN/docs/Mozilla/Tech/XPCOM/Array" title="/en-US/docs/JavaScript/Reference/Global_Objects/Array">Array</a></code> :</p> - -<pre class="brush: js">function arrayFromMask (nMask) { - // nMask 必须介于 -2147483648 和 2147483647 之间 - if (nMask > 0x7fffffff || nMask < -0x80000000) { - throw new TypeError("arrayFromMask - out of range"); - } - for (var nShifted = nMask, aFromMask = []; nShifted; - aFromMask.push(Boolean(nShifted & 1)), nShifted >>>= 1); - return aFromMask; -} - -var array1 = arrayFromMask(11); -var array2 = arrayFromMask(4); -var array3 = arrayFromMask(1); - -alert("[" + array1.join(", ") + "]"); -// 打印 "[true, true, false, true]", i.e.: 11, i.e.: 1011 -</pre> - -<p>你可以同时测试以上两个算法……</p> - -<pre class="brush: js">var nTest = 19; // our custom mask -var nResult = createMask.apply(this, arrayFromMask(nTest)); - -alert(nResult); // 19 -</pre> - -<p>仅仅由于教学目的 (因为有 <code><a href="/zh-CN/docs/JavaScript/Reference/Global_Objects/Number" title="/en-US/docs/JavaScript/Reference/Global_Objects/Number/toString">Number.toString(2)</a></code> 方法),我们展示如何修改 arrayFromMask 算法通过 Number 返回二进制的 String,而非 Boolean Array:</p> - -<pre class="brush: js">function createBinaryString (nMask) { - // nMask must be between -2147483648 and 2147483647 - for (var nFlag = 0, nShifted = nMask, sMask = ""; nFlag < 32; - nFlag++, sMask += String(nShifted >>> 31), nShifted <<= 1); - return sMask; -} - -var string1 = createBinaryString(11); -var string2 = createBinaryString(4); -var string3 = createBinaryString(1); - -alert(string1); -// 打印 00000000000000000000000000001011, i.e. 11 -</pre> - -<h2 id="规范">规范</h2> - -<table class="standard-table"> - <tbody> - <tr> - <th scope="col">Specification</th> - <th scope="col">Status</th> - <th scope="col">Comment</th> - </tr> - <tr> - <td>ECMAScript 1st Edition.</td> - <td>Standard</td> - <td>Initial definition.</td> - </tr> - <tr> - <td>{{SpecName('ES5.1', '#sec-11.4.8', 'Bitwise NOT operator')}}<br> - {{SpecName('ES5.1', '#sec-11.7', 'Bitwise shift operators')}}<br> - {{SpecName('ES5.1', '#sec-11.10', 'Binary bitwise operators')}}</td> - <td>{{Spec2('ES5.1')}}</td> - <td></td> - </tr> - <tr> - <td>{{SpecName('ES6', '#sec-bitwise-not-operator', 'Bitwise NOT operator')}}<br> - {{SpecName('ES6', '#sec-bitwise-shift-operators', 'Bitwise shift operators')}}<br> - {{SpecName('ES6', '#sec-binary-bitwise-operators', 'Binary bitwise operators')}}</td> - <td>{{Spec2('ES6')}}</td> - <td></td> - </tr> - </tbody> -</table> - -<h2 id="浏览器兼容性">浏览器兼容性</h2> - -<p>{{ CompatibilityTable() }}</p> - -<div id="compat-desktop"> -<table class="compat-table"> - <tbody> - <tr> - <th>Feature</th> - <th>Chrome</th> - <th>Firefox (Gecko)</th> - <th>Internet Explorer</th> - <th>Opera</th> - <th>Safari</th> - </tr> - <tr> - <td><a href="#Bitwise_NOT">Bitwise NOT (<code>~</code>)</a></td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - </tr> - <tr> - <td><a href="#Bitwise_AND">Bitwise AND (<code>&</code>)</a></td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - </tr> - <tr> - <td><a href="#Bitwise_OR">Bitwise OR (<code>|</code>)</a></td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - </tr> - <tr> - <td><a href="#Bitwise_XOR">Bitwise XOR (<code>^</code>)</a></td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - </tr> - <tr> - <td><a href="#Left_shift">Left shift (<code><<</code>)</a></td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - </tr> - <tr> - <td><a href="#Right_shift">Right shift (<code>>></code>)</a></td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - </tr> - <tr> - <td><a href="#Unsigned_right_shift">Unsigned right shift (<code>>>></code>)</a></td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - </tr> - </tbody> -</table> -</div> - -<div id="compat-mobile"> -<table class="compat-table"> - <tbody> - <tr> - <th>Feature</th> - <th>Android</th> - <th>Chrome for Android</th> - <th>Firefox Mobile (Gecko)</th> - <th>IE Mobile</th> - <th>Opera Mobile</th> - <th>Safari Mobile</th> - </tr> - <tr> - <td><a href="#Bitwise_NOT">Bitwise NOT (<code>~</code>)</a></td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - </tr> - <tr> - <td><a href="#Bitwise_AND">Bitwise AND (<code>&</code>)</a></td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - </tr> - <tr> - <td><a href="#Bitwise_OR">Bitwise OR (<code>|</code>)</a></td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - </tr> - <tr> - <td><a href="#Bitwise_XOR">Bitwise XOR (<code>^</code>)</a></td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - </tr> - <tr> - <td><a href="#Left_shift">Left shift (<code><<</code>)</a></td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - </tr> - <tr> - <td><a href="#Right_shift">Right shift (<code>>></code>)</a></td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - </tr> - <tr> - <td><a href="#Unsigned_right_shift">Unsigned right shift (<code>>>></code>)</a></td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - <td>{{ CompatVersionUnknown() }}</td> - </tr> - </tbody> -</table> -</div> - -<h2 id="See_also" name="See_also">相关链接</h2> - -<ul> - <li><a href="/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators">Logical operators</a></li> - <li> - <p><strong>js ^</strong> & <strong>Bitwise Operators</strong></p> - </li> -</ul> diff --git a/files/zh-cn/web/javascript/reference/operators/comparison_operators/index.html b/files/zh-cn/web/javascript/reference/operators/comparison_operators/index.html deleted file mode 100644 index 5ddf85f426..0000000000 --- a/files/zh-cn/web/javascript/reference/operators/comparison_operators/index.html +++ /dev/null @@ -1,278 +0,0 @@ ---- -title: 比较操作符 -slug: Web/JavaScript/Reference/Operators/Comparison_Operators -tags: - - 严格比较操作符 - - 比较操作符 -translation_of: Web/JavaScript/Reference/Operators -translation_of_original: Web/JavaScript/Reference/Operators/Comparison_Operators ---- -<div>{{jsSidebar("Operators")}}</div> - -<p>JavaScript 有两种比较方式:严格比较运算符和转换类型比较运算符。对于严格比较运算符(===)来说,仅当两个操作数的类型相同且值相等为 true,而对于被广泛使用的比较运算符(==)来说,会在进行比较之前,将两个操作数转换成相同的类型。对于关系运算符(比如 <=)来说,会先将操作数转为原始值,使它们类型相同,再进行比较运算。</p> - -<p>字符串比较则是使用基于标准字典的 Unicode 值来进行比较的。</p> - -<p>比较的特点:</p> - -<ul> - <li>对于两个拥有相同字符顺序,相同长度,并且每个字符的位置都匹配的字符串,应该使用严格比较运算符。</li> - <li><span style="line-height: 1.5;"> 对于两个数值相同的数字应该使用严格比较运算符,NaN和任何值不相等,包括其自身,正数零等于负数零。</span></li> - <li>对于两个同为true或同为false的布尔操作数,应使用严格比较运算符。</li> - <li>不要使用严格比较运算符或比较运算符来比较两个不相等的对象。</li> - <li>当比较一个表达式和一个对象时,仅当两个操作数引用相同的对象(指针指向相同对象)。</li> - <li>对于Null 和 Undefined 类型而言,应使用严格比较运算符比较其自身,使用比较运算符进行互相比较。</li> -</ul> - -<h2 id="相等运算符">相等运算符</h2> - -<h3 id="相等()">相等(==)</h3> - -<p>比较操作符会为两个不同类型的操作数转换类型,然后进行严格比较。当两个操作数都是对象时,JavaScript会比较其内部引用,当且仅当他们的引用指向内存中的相同对象(区域)时才相等,即他们在栈内存中的引用地址相同。</p> - -<h4 id="语法">语法</h4> - -<pre class="syntaxbox">x == y -</pre> - -<h4 id="例子">例子</h4> - -<pre class="brush: js"> 1 == 1 // true -"1" == 1 // true - 1 == '1' // true - 0 == false // true -</pre> - -<h3 id="不相等_(!)"><a name="Inequality">不相等 (!=)</a></h3> - -<p>不等操作符仅当操作数不相等时返回true,如果两操作数不是同一类型,JavaScript会尝试将其转为一个合适的类型,然后进行比较。如果两操作数为对象类型,JavaScript会比较其内部引用地址,仅当他们在内存中引用不同对象时不相等。</p> - -<h4 id="语法_2">语法</h4> - -<pre class="syntaxbox">x != y</pre> - -<h4 id="例子_2">例子</h4> - -<pre class="brush: js">1 != 2 // true -1 != "1" // false -1 != '1' // false -1 != true // false -0 != false // false -</pre> - -<h3 id="一致严格相等_()"><a name="Identity">一致/严格相等 (===)</a></h3> - -<p>一致运算符不会进行类型转换,仅当操作数严格相等时返回true</p> - -<h4 id="语法_3">语法</h4> - -<pre class="syntaxbox">x === y</pre> - -<h4 id="例子_3">例子</h4> - -<pre class="brush: js ">3 === 3 // true -3 === '3' // false -var object1 = {"value":"key"}, object2={"value":"key"}; -object1 === object2 //false</pre> - -<h3 id="不一致严格不相等_(!)"><a name="Nonidentity">不一致/严格不相等 (!==)</a></h3> - -<p>不一致运算符当操作数不相等或不同类型时返回true</p> - -<h4 id="语法_4">语法</h4> - -<pre class="syntaxbox">x !== y</pre> - -<h4 id="例子_4">例子</h4> - -<pre class="brush: js">3 !== '3' // true -4 !== 3 // true -</pre> - -<h2 id="关系运算符">关系运算符</h2> - -<h3 id="大于运算符_(>)"><a name="Greater_than_operator">大于运算符 (>)</a></h3> - -<p>大于运算符仅当左操作数大于右操作数时返回true</p> - -<h4 id="语法_5">语法</h4> - -<pre class="syntaxbox">x > y</pre> - -<h4 id="例子_5">例子</h4> - -<pre class="brush: js">4 > 3 // true -</pre> - -<h3 id="大于等于运算符_(>)"><a name="Greater_than_or_equal_operator">大于等于运算符 (>=)</a></h3> - -<p>大于等于运算符当左操作数大于或等于右操作数时返回true</p> - -<h4 id="语法_6">语法</h4> - -<pre class="syntaxbox"> x >= y</pre> - -<h4 id="例子_6">例子</h4> - -<pre class="brush: js">4 >= 3 // true -3 >= 3 // true -</pre> - -<h3 id="小于运算符_(<)"><a name="Less_than_operator">小于运算符 (<)</a></h3> - -<p>小于运算符仅当左操作数小于右操作数时返回true</p> - -<h4 id="语法_7">语法</h4> - -<pre class="syntaxbox"> x < y</pre> - -<h4 id="例子_7">例子</h4> - -<pre class="brush: js">3 < 4 // true -</pre> - -<h3 id="小于等于运算符_(<)"><a id="Less_than_or_equal_operator" name="Less_than_or_equal_operator">小于等于运算符 (<=)</a></h3> - -<p>小于等于运算符当左操作数小于或等于右操作数时返回true</p> - -<h4 id="语法_8">语法</h4> - -<pre class="syntaxbox"> x <= y</pre> - -<h4 id="例子_8">例子</h4> - -<pre class="brush: js">3 <= 4 // true -</pre> - -<h2 id="使用比较操作符">使用比较操作符</h2> - -<p>标准相等操作符(<code>==</code> and <code>!=</code>) 使用 <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3">Abstract Equality Comparison Algorithm</a> 去比较两个操作数。当两个操作数类型不相等时,会在比较前尝试将其转换为相同类型。 e.g., 对于表达式 <code>5 == '5'</code>, 在比较前会先将右边字符串类型的操作数 5 转换为数字。</p> - -<p>严格相等操作符 (<code>===</code> and <code>!==</code>) 使用 Strict Equality Comparison Algorithm 并尝试对两个相同操作数进行相等比较,如果它们的类型不相等,那么永远会返回false 所以 <code>5 !== '5'。</code></p> - -<p>当需要明确操作数的类型和值的时候,或者操作数的确切类型非常重要时,应使用严格相等操作符。否则,当你允许操作数在比较前进行类型转换时,可以使用标准相等操作符来比较。</p> - -<p>当比较运算涉及类型转换时 (i.e., non–strict comparison), JavaScript 会按以下规则对字符串,数字,布尔或对象类型的操作数进行操作:</p> - -<ul> - <li>当比较数字和字符串时,字符串会转换成数字值。 JavaScript 尝试将数字字面量转换为数字类型的值。 首先, 一个数学上的值会从数字字面量中衍生出来,然后这个值将被转为一个最接近的<code>Number</code>类型的值。</li> - <li>如果其中一个操作数为布尔类型,那么布尔操作数如果为true,那么会转换为1,如果为false,会转换为整数0,即0。</li> - <li>如果一个对象与数字或字符串相比较,JavaScript会尝试返回对象的默认值。操作符会尝试通过方法valueOf和toString将对象转换为其原始值(一个字符串或数字类型的值)。如果尝试转换失败,会产生一个运行时错误。</li> - <li>注意:当且仅当与原始值比较时,对象会被转换为原始值。当两个操作数均为对象时,它们作为对象进行比较,仅当它们引用相同对象时返回true。</li> -</ul> - -<div class="note"><strong>注意:</strong> 字符串对象的类型是对象,不是字符串!字符串对象很少被使用,所以下面的结果也许会让你惊讶:</div> - -<pre class="brush:js">// true as both operands are Type String (i.e. string primitives): -'foo' === 'foo' - -var a = new String('foo'); -var b = new String('foo'); - -// false as a and b are Type Object and reference different objects -a == b - -// false as a and b are Type Object and reference different objects -a === b - -// true as a and 'foo' are of different type and, the Object (a) -// is converted to String 'foo' before comparison -a == 'foo' </pre> - -<h2 id="Specifications">Specifications</h2> - -<table class="standard-table"> - <tbody> - <tr> - <th scope="col">Specification</th> - <th scope="col">Status</th> - <th scope="col">Comment</th> - </tr> - <tr> - <td>ECMAScript 1st Edition.</td> - <td>Standard</td> - <td>Initial definition. Implemented in JavaScript 1.0</td> - </tr> - <tr> - <td>ECMAScript 3rd Edition.</td> - <td>Standard</td> - <td>Adds <code>===</code> and <code>!==</code> operators. Implemented in JavaScript 1.3</td> - </tr> - <tr> - <td>{{SpecName('ES5.1', '#sec-11.8', 'Relational Operators')}}<br> - {{SpecName('ES5.1', '#sec-11.9', 'Equality Operators')}}</td> - <td>{{Spec2('ES5.1')}}</td> - <td>Defined in several sections of the specification: <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.8">Relational Operators</a>, <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.9">Equality Operators</a></td> - </tr> - <tr> - <td>{{SpecName('ES6', '#sec-relational-operators', 'Relational Operators')}}<br> - {{SpecName('ES6', '#sec-equality-operators', 'Equality Operators')}}</td> - <td>{{Spec2('ES6')}}</td> - <td>Defined in several sections of the specification: <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-relational-operators">Relational Operators</a>, <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-equality-operators">Equality Operators</a></td> - </tr> - <tr> - <td>{{SpecName('ESDraft', '#sec-relational-operators')}}</td> - <td>{{Spec2('ESDraft')}}</td> - <td>Defined in several sections of the specification: <a href="http://tc39.github.io/ecma262/#sec-relational-operators">Relational Operators</a>, <a href="http://tc39.github.io/ecma262/#sec-equality-operators">Equality Operators</a></td> - </tr> - </tbody> -</table> - -<h2 id="Browser_compatibility">Browser compatibility</h2> - -<p>{{CompatibilityTable}}</p> - -<div id="compat-desktop"> -<table class="compat-table"> - <tbody> - <tr> - <th>Feature</th> - <th>Chrome</th> - <th>Firefox (Gecko)</th> - <th>Internet Explorer</th> - <th>Opera</th> - <th>Safari</th> - </tr> - <tr> - <td>Basic support</td> - <td>{{CompatVersionUnknown}}</td> - <td>{{CompatVersionUnknown}}</td> - <td>{{CompatVersionUnknown}}</td> - <td>{{CompatVersionUnknown}}</td> - <td>{{CompatVersionUnknown}}</td> - </tr> - </tbody> -</table> -</div> - -<div id="compat-mobile"> -<table class="compat-table"> - <tbody> - <tr> - <th>Feature</th> - <th>Android</th> - <th>Chrome for Android</th> - <th>Firefox Mobile (Gecko)</th> - <th>IE Mobile</th> - <th>Opera Mobile</th> - <th>Safari Mobile</th> - </tr> - <tr> - <td>Basic support</td> - <td>{{CompatVersionUnknown}}</td> - <td>{{CompatVersionUnknown}}</td> - <td>{{CompatVersionUnknown}}</td> - <td>{{CompatVersionUnknown}}</td> - <td>{{CompatVersionUnknown}}</td> - <td>{{CompatVersionUnknown}}</td> - </tr> - </tbody> -</table> -</div> - -<h2 id="See_also">See also</h2> - -<ul> - <li>{{jsxref("Object.is()")}}</li> - <li><a href="/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness">Equality comparisons and sameness</a></li> -</ul> diff --git a/files/zh-cn/web/javascript/reference/operators/自减/index.html b/files/zh-cn/web/javascript/reference/operators/decrement/index.html index f405740df3..f405740df3 100644 --- a/files/zh-cn/web/javascript/reference/operators/自减/index.html +++ b/files/zh-cn/web/javascript/reference/operators/decrement/index.html diff --git a/files/zh-cn/web/javascript/reference/operators/相等/index.html b/files/zh-cn/web/javascript/reference/operators/equality/index.html index e100ec1d2d..e100ec1d2d 100644 --- a/files/zh-cn/web/javascript/reference/operators/相等/index.html +++ b/files/zh-cn/web/javascript/reference/operators/equality/index.html diff --git a/files/zh-cn/web/javascript/reference/operators/逻辑和/index.html b/files/zh-cn/web/javascript/reference/operators/logical_and/index.html index de38317f42..de38317f42 100644 --- a/files/zh-cn/web/javascript/reference/operators/逻辑和/index.html +++ b/files/zh-cn/web/javascript/reference/operators/logical_and/index.html diff --git a/files/zh-cn/web/javascript/reference/operators/logical_operators/index.html b/files/zh-cn/web/javascript/reference/operators/logical_operators/index.html deleted file mode 100644 index 5615e17d45..0000000000 --- a/files/zh-cn/web/javascript/reference/operators/logical_operators/index.html +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: 逻辑运算符 -slug: Web/JavaScript/Reference/Operators/Logical_Operators -tags: - - JavaScript - - 操作符 - - 逻辑 -translation_of: Web/JavaScript/Reference/Operators -translation_of_original: Web/JavaScript/Reference/Operators/Logical_Operators ---- -<div>{{jsSidebar("Operators")}}</div> - -<p>逻辑运算符通常用于{{jsxref("Boolean","布尔")}}型(逻辑)值。这种情况下,它们返回一个布尔值。然而,<code>&&</code> 和 <code>||</code> 运算符会返回一个指定操作数的值,因此,这些运算符也用于非布尔值。这时,它们也就会返回一个非布尔型值。</p> - -<div>{{EmbedInteractiveExample("pages/js/expressions-logicaloperator.html")}}</div> - - - -<h2 id="描述">描述</h2> - -<p>逻辑运算符如下表所示 (其中<code><em>expr</em></code>可能是任何一种<a href="https://developer.mozilla.org/zh-CN/docs/Glossary/Data_structure">类型</a>, 不一定是布尔值):</p> - -<table class="fullwidth-table syntaxbox"> - <tbody> - <tr> - <th>运算符</th> - <th>语法</th> - <th>说明</th> - </tr> - <tr> - <td>逻辑与,AND(<code>&&</code>)</td> - <td><code><em>expr1</em> && <em>expr2</em></code></td> - <td>若 <code>expr<strong>1</strong></code> 可转换为 <code>true</code>,则返回 <code>expr<strong>2</strong></code>;否则,返回 <code>expr<strong>1</strong></code>。</td> - </tr> - <tr> - <td>逻辑或,OR(<code>||</code>)</td> - <td><code><em>expr1</em> || <em>expr2</em></code></td> - <td>若 <code>expr<strong>1</strong></code> 可转换为 <code>true</code>,则返回 <code>expr<strong>1</strong></code>;否则,返回 <code>expr<strong>2</strong></code>。</td> - </tr> - <tr> - <td>逻辑非,NOT(<code>!</code>)</td> - <td><code>!<em>expr</em></code></td> - <td>若 <code>expr</code> 可转换为 <code>true</code>,则返回 <code>false</code>;否则,返回 <code>true</code>。</td> - </tr> - </tbody> -</table> - -<p>如果一个值可以被转换为 <code>true</code>,那么这个值就是所谓的 {{Glossary("truthy")}},如果可以被转换为 <code>false</code>,那么这个值就是所谓的 {{Glossary("falsy")}}。</p> - -<p>会被转换为 <code>false</code> 的表达式有:</p> - -<ul> - <li><code>null</code>;</li> - <li><code>NaN</code>;</li> - <li><code>0</code>;</li> - <li>空字符串(<code>""</code> or <code>''</code> or <code>``</code>);</li> - <li><code>undefined</code>。</li> -</ul> - -<p>尽管 <code>&&</code> 和 <code>||</code> 运算符能够使用非布尔值的操作数, 但它们依然可以被看作是布尔操作符,因为它们的返回值总是能够被转换为布尔值。如果要显式地将它们的返回值(或者表达式)转换为布尔值,请使用<a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Logical_Operators#%E9%80%BB%E8%BE%91%E9%9D%9E%EF%BC%88!%EF%BC%89">双重非运算符</a>(即<code>!!</code>)或者<a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Boolean">Boolean</a>构造函数。</p> - -<h3 id="短路计算">短路计算</h3> - -<p>由于逻辑表达式的运算顺序是从左到右,也可以用以下规则进行"短路"计算:</p> - -<ul> - <li><code>(some falsy expression) && (<em>expr)</em></code> 短路计算的结果为假。</li> - <li><code>(some truthy expression) || <em>(expr)</em></code> 短路计算的结果为真。</li> -</ul> - -<p>短路意味着上述表达式中的expr部分<strong>不会被执行</strong>,因此expr的任何副作用都不会生效(举个例子,如果expr是一次函数调用,这次调用就不会发生)。造成这种现象的原因是,整个表达式的值在第一个操作数被计算后已经确定了。看一个例子:</p> - -<pre class="brush: js">function A(){ console.log('called A'); return false; } -function B(){ console.log('called B'); return true; } - -console.log( A() && B() ); -// logs "called A" due to the function call, -// then logs false (which is the resulting value of the operator) - -console.log( B() || A() ); -// logs "called B" due to the function call, -// then logs true (which is the resulting value of the operator) -</pre> - -<h3 id="Operators_precedence">Operators precedence</h3> - -<p>请注意,由于<a href="/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence">运算符优先级</a>的存在,下面的表达式的结果却不相同。右侧被小括号括起来的操作变成了独立的表达式。</p> - -<pre class="brush: js">false && true || true // 结果为 true -false && (true || true) // 结果为 false -</pre> - -<h3 id="逻辑与()">逻辑与(<code>&&</code>)</h3> - -<p>下面的代码是 && (逻辑与) 运算符的示例.</p> - -<pre class="brush: js">a1 = true && true // t && t 返回 true -a2 = true && false // t && f 返回 false -a3 = false && true // f && t 返回 false -a4 = false && (3 == 4) // f && f 返回 false -a5 = "Cat" && "Dog" // t && t 返回 "Dog" -a6 = false && "Cat" // f && t 返回 false -a7 = "Cat" && false // t && f 返回 false -a8 = '' && false // f && f 返回 "" -a9 = false && '' // f && f 返回 false -</pre> - -<h3 id="逻辑或()">逻辑或(<code>||</code>)</h3> - -<p>下面的代码是 || (逻辑或) 运算符的示例。</p> - -<pre class="brush: js">o1 = true || true // t || t 返回 true -o2 = false || true // f || t 返回 true -o3 = true || false // t || f 返回 true -o4 = false || (3 == 4) // f || f 返回 false -o5 = "Cat" || "Dog" // t || t 返回 "Cat" -o6 = false || "Cat" // f || t 返回 "Cat" -o7 = "Cat" || false // t || f 返回 "Cat" -o8 = '' || false // f || f 返回 false -o9 = false || '' // f || f 返回 "" -</pre> - -<h3 id="逻辑非(!)">逻辑非(<code>!</code>)</h3> - -<p>下面的代码是 <code>!</code> (逻辑非) 运算符的示例.</p> - -<pre class="brush: js">n1 = !true // !t 返回 false -n2 = !false // !f 返回 true -n3 = !'' // !f 返回 true -n4 = !'Cat' // !t 返回 false -</pre> - -<h4 id="双重非(!!)运算符">双重非(<code>!!</code>)运算符</h4> - -<p>可能使用双重非运算符的一个场景,是显式地将任意值强制转换为其对应的<a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures#%E5%B8%83%E5%B0%94%E7%B1%BB%E5%9E%8B">布尔值</a>。这种转换是基于被转换值的 "truthyness" 和 "falsyness"的(参见 {{Glossary("truthy")}} 和 {{Glossary("falsy")}})。</p> - -<p>同样的转换可以通过 <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean">Boolean</a> 函数完成。</p> - -<pre class="brush: js syntaxbox">n1 = !!true // !!truthy 返回 true -n2 = !!{} // !!truthy 返回 true: <strong>任何</strong> 对象都是 truthy 的… -n3 = !!(new Boolean(false)) // …甚至 <em>.valueOf()</em> 返回 false 的布尔值对象也是! -n4 = !!false // !!falsy 返回 false -n5 = !!"" // !!falsy 返回 false -n6 = !!Boolean(false) // !!falsy 返回 false -</pre> - -<h3 id="布尔值转换规则">布尔值转换规则</h3> - -<h4 id="将_AND_转换为_OR">将 AND 转换为 OR</h4> - -<p>以下涉及<strong>布尔</strong>运算的操作:</p> - -<pre class="brush: js">bCondition1 && bCondition2</pre> - -<p>总是等于:</p> - -<pre class="brush: js">!(!bCondition1 || !bCondition2)</pre> - -<h4 id="将_OR_转换为_AND">将 OR 转换为 AND</h4> - -<p>以下涉及<strong>布尔</strong>运算的操作:</p> - -<pre class="brush: js">bCondition1 || bCondition2</pre> - -<p>总是等于:</p> - -<pre class="brush: js">!(!bCondition1 && !bCondition2)</pre> - -<h3 id="删除嵌套的小括号">删除嵌套的小括号</h3> - -<p>由于逻辑表达式是从左往右计算的,所以,通常可以按照下面的规则删除小括号。</p> - -<h4 id="删除嵌套的_AND">删除嵌套的 AND</h4> - -<p>以下涉及<strong>布尔</strong>运算的操作:</p> - -<pre class="brush: js">bCondition1 || (bCondition2 && bCondition3)</pre> - -<p>总是等于:</p> - -<pre class="brush: js">bCondition1 || bCondition2 && bCondition3</pre> - -<h4 id="删除嵌套的_OR">删除嵌套的 OR</h4> - -<p>以下涉及<strong>布尔</strong>运算的操作:</p> - -<pre class="brush: js">bCondition1 && (bCondition2 || bCondition3)</pre> - -<p>总是等于:</p> - -<pre class="brush: js">!(!bCondition1 || !bCondition2 && !bCondition3)</pre> - -<h2 id="规范">规范</h2> - -<table class="standard-table"> - <tbody> - <tr> - <th scope="col">规范</th> - <th scope="col">状态</th> - <th scope="col">备注</th> - </tr> - <tr> - <td>{{SpecName('ES1')}}</td> - <td>{{Spec2('ES1')}}</td> - <td>Initial definition.</td> - </tr> - <tr> - <td>{{SpecName('ES5.1', '#sec-11.11')}}</td> - <td>{{Spec2('ES5.1')}}</td> - <td>Defined in several sections of the specification: <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.4.9">Logical NOT Operator</a>, <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.11">Binary Logical Operators</a></td> - </tr> - <tr> - <td>{{SpecName('ES6', '#sec-binary-logical-operators')}}</td> - <td>{{Spec2('ES6')}}</td> - <td>Defined in several sections of the specification: <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-logical-not-operator">Logical NOT Operator</a>, <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-binary-logical-operators">Binary Logical Operators</a></td> - </tr> - <tr> - <td>{{SpecName('ESDraft', '#sec-binary-logical-operators')}}</td> - <td>{{Spec2('ESDraft')}}</td> - <td>Defined in several sections of the specification: <a href="http://tc39.github.io/ecma262/#sec-logical-not-operator">Logical NOT Operator</a>, <a href="http://tc39.github.io/ecma262/#sec-binary-logical-operators">Binary Logical Operators</a></td> - </tr> - </tbody> -</table> - -<h2 id="浏览器兼容性">浏览器兼容性</h2> - - - -<p>{{Compat("javascript.operators.logical")}}</p> - -<h2 id="参见">参见</h2> - -<ul> - <li><a href="/zh-CN/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators">按位操作符</a></li> - <li><a href="/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Boolean">布尔值</a></li> - <li><a href="/zh-CN/docs/Glossary/Truthy">Truthy</a></li> - <li><a href="/zh-CN/docs/Glossary/Falsy">Falsy</a></li> -</ul> diff --git a/files/zh-cn/web/javascript/reference/operators/可选链/index.html b/files/zh-cn/web/javascript/reference/operators/optional_chaining/index.html index da2f04c775..da2f04c775 100644 --- a/files/zh-cn/web/javascript/reference/operators/可选链/index.html +++ b/files/zh-cn/web/javascript/reference/operators/optional_chaining/index.html diff --git a/files/zh-cn/web/javascript/reference/operators/管道操作符/index.html b/files/zh-cn/web/javascript/reference/operators/pipeline_operator/index.html index 06ce40ad0b..06ce40ad0b 100644 --- a/files/zh-cn/web/javascript/reference/operators/管道操作符/index.html +++ b/files/zh-cn/web/javascript/reference/operators/pipeline_operator/index.html diff --git a/files/zh-cn/web/javascript/reference/operators/取余/index.html b/files/zh-cn/web/javascript/reference/operators/remainder/index.html index 276296ccd7..276296ccd7 100644 --- a/files/zh-cn/web/javascript/reference/operators/取余/index.html +++ b/files/zh-cn/web/javascript/reference/operators/remainder/index.html |