马黑黑 发表于 2026-3-8 08:23

JS : 'a' ** 0 = 1

<style>
        .showBox { font: normal 18px/1.2 sans-serif; overflow: auto; position: relative; }
        .showBox p { margin: 10px 0; }
        .showBox code, .showBox pre { background: rgba(0,128,128,.25); padding: 2px 6px; tab-size: 4; }
        .showBox pre { padding: 10px 20px; white-space: pre-wrap; word-wrap: break-word; }
        .showBox pre code { padding: 0; background: none; }
        .showBox blockquote { margin: 10px 20px; padding: 2px 15px; border-left: 3px solid skyblue; background: rgba(240,248,255,.65); }
</style>

<div class="showBox">
    <p>先看看JS运算式子 ——</p>
    <h3>   'a' ** 0 = 1</h3>
    <p>
      <code>'a' ** 0 = 1</code> 这样的计算式子并不符合数学约定,但在 JS 中可以正常进行计算,答案为 1 。式子中,
      <code>'a'</code> 是一个字符,可以是别的任意字符,例如
      <code>'我'</code>、
      <code>'得瑟'</code>、
      <code>'Let it go'</code> 等等都行;
      <code>** </code> 是指数运算符,例如求 x 的 y 次方写成
      <code>x ** y</code>,等价于 JS 的 Math 方法
      <code>Math.pow(x, y)</code>;
      <code>0</code> 在式子中是次方的意思。
    </p>
    <pre><code>console.log('a' ** 0); // → 1
console.log(Math.pow('a', 0)); // → 1</code></pre>
    <p>从数学的角度出发,任何非0的数的0次方都等于 1 。上述式子中的
      <code>'a'</code>不是数字,理论上不能参与运算,在 JS 中则可以,因为 JS 的数据类型是动态类型即 Dynamically Typed,因此字符串参与数学运算时 JS 一样正常执行:
    </p>
    <pre><code>console.log('2px' - 10); // → NaN</code></pre>
    <p>而
      <code>NaN</code> 是一个特殊的数字类型,意为 Not a number,不是一个数字。不是一个数字但属于数字类型,特殊的,于是字符串就可以堂而皇之地参与数学运算。
    </p>
    <blockquote>
      <p>
            <em>number</em> 类型代表整数和浮点数,介于 -(25
            <sup>3</sup>-1) ~ (25
            <sup>3</sup>-1) 之间,超出这个范围的数字可以使用后来增加的
            <em>BigInt</em> 类型表示以追求运算的精准度(IE不支持)。
      </p>
    </blockquote>
    <p>求字符串的0次方其实是求 NaN 这个特殊数字的零次方。在JS中,特殊数字还有一个
      <code>Infinity</code>,无穷大 ∞。NaN 和 Infinity 既然都是数字,那么,它们的0次方当然就是 1,这是 JS 的运算逻辑。
    </p>
    <p>无穷大怎么来?</p>
    <pre><code>console.log(1 / 0); //→ Infinity</code></pre>
    <p>钱不多没有关系,只要是大于0的任意数字,如果0个人平分,你就是比亿万富翁还厉害的主。但千万别小于0,否则你将比亿万负翁要惨到无法形容。0除以0这事别干,NaN 是唯一答案,NaN 这货是一个特殊的数字且具有粘连性,求其0次方你会拿到1块大洋,然而其它任何运算都是 NaN,很遗憾特殊数字不意味着是天文数字。</p>
    <p>最后出个题:执行语句
      <code>console.log(0 ** 0);</code> 得到什么?
    </p>
    <p>【提示】在数学中,由于诸多原因,0的0次方未被统一定义。但是,JS老哥是个狠人,为了保持运算一致性,为了遵循 IEEE 754 标准的相关约定……</p>
</div>

红影 发表于 2026-3-8 19:38

console.log(0 ** 0);应该也是1,既然console.log('a' ** 0); // → 1,'a' 是任意字符,当然也可以是0啊{:4_173:}

红影 发表于 2026-3-8 19:41

console.log('a' ** 2); 应该是 NaN吧?

红影 发表于 2026-3-8 19:41

无论什么的0次方都是1,JS真够狠的。这个以前一点不知道,学习了,感谢黑黑的讲解{:4_187:}

马黑黑 发表于 2026-3-8 20:36

红影 发表于 2026-3-8 19:38
console.log(0 ** 0);应该也是1,既然console.log('a' ** 0); // → 1,'a' 是任意字符,当然也可以是0啊{: ...

正确,理科生对JS运算逻辑的理解还是到位的

马黑黑 发表于 2026-3-8 20:37

红影 发表于 2026-3-8 19:41
console.log('a' ** 2); 应该是 NaN吧?

对。数学能力没减

马黑黑 发表于 2026-3-8 20:37

红影 发表于 2026-3-8 19:41
无论什么的0次方都是1,JS真够狠的。这个以前一点不知道,学习了,感谢黑黑的讲解

其它编程语言不一定这样,JS 相对特殊
页: [1]
查看完整版本: JS : 'a' ** 0 = 1