{ }codelper
相等比较与类型转换空值 nullP0084

宽松相等与严格相等

给定 n 对值。
每个值都是可以直接写进 JavaScript 代码的文字片段:整数(如 5、-12、-0)、用双引号括起来的字符串(如 "5"、""、"abc"),或者 true、false、null、undefined、NaN 之一。
把两个片段变成对应的 JavaScript 值 a、b,每对输出一行:若 a === b 为真输出 "===",否则若 a == b 为真输出 "==",两者都为假输出 "!="。

输入
第一行 n(1 ≤ n ≤ 1000),接下来 n 行每行两个片段,用一个空格分隔。
整数在 -1000 到 1000 之间,除 0 本身外不以 0 开头(可能出现 -0)。
字符串引号内为空,或只有 1~4 个数字(可以以 0 开头),或只有 1~5 个小写英文字母。
引号内没有空格。
输出
n 行,每行是 ===、==、!= 之一
样例 1 · stdin
5
5 "5"
"5" "5"
NaN NaN
null undefined
false "0"
stdout
==
===
!=
==
==
样例 2 · stdin
4
null 0
0 -0
"" 0
true "abc"
stdout
!=
===
==
!=
main.py
输入(stdin)

运行时这些行会依次作为 input()/标准输入传入(运行中不会等待输入)。

$ 就绪

请在电脑上打开以编写和运行代码。在手机上可以查看题目和题解。

其他语言怎么写?查看各语言题解 · 2 种语言题解

本题只接受 JavaScript 和 TypeScript。
先转换类型再比较的 == 是这两种语言的规则(Python、Java、C# 的 == 不会这样转换不同类型)。
首先要把片段变成值:原样读入的话全是字符串,5 和 "5" 不是相同的文字,而 NaN 和 NaN 却成了相同的文字。
== 遇到数字和字符串时把字符串转成数字("" == 0、"007" == 7),遇到布尔值时把它转成 1 或 0(false == "0" 为真,true == "abc" 为假),所以它不同于“都像真值就相等”。
但 null 和 undefined 只和彼此 ==,null == 0、null == false 都为假,所以记成“两边都转成数字再比”就会错(Number(null) 是 0)。
NaN 无论用 === 还是 == 都不等于自己。
Object.is 看起来像 ===,但它认为 NaN 等于自己、0 和 -0 不同,在这里用会出错。
TypeScript 对已收窄为 string 和 number 的两个值用 == 比较会报 TS2367 错误,所以要用联合类型(string | number | boolean | null | undefined)接收;运行结果与 JavaScript 完全相同。
Craykon 没有这样的 ==(用 空 计算会停止)。

JavaScriptmain.js · 20 行
const lines = require("fs").readFileSync(0, "utf8").split("\n");const n = Number(lines[0]); // 글자 토막 하나를 JavaScript 값으로 바꾼다function parse(token) {  if (token.startsWith('"')) return token.slice(1, -1); // "5" → 문자열 5  if (token === "true") return true;  if (token === "false") return false;  if (token === "null") return null;  if (token === "undefined") return undefined;  if (token === "NaN") return NaN;  return Number(token); // -0 도 그대로 -0} const out = [];for (let i = 1; i <= n; i++) {  const [a, b] = lines[i].trim().split(" ").map(parse);  out.push(a === b ? "===" : a == b ? "==" : "!=");}console.log(out.join("\n"));
TypeScriptmain.ts · 28 行
import { readFileSync } from "node:fs";const lines: string[] = readFileSync(0, "utf8").split("\n");const n: number = Number(lines[0]); type Value = string | number | boolean | null | undefined; // 글자 토막 하나를 값으로 바꾼다function parse(token: string): Value {  if (token.startsWith('"')) return token.slice(1, -1);  if (token === "true") return true;  if (token === "false") return false;  if (token === "null") return null;  if (token === "undefined") return undefined;  if (token === "NaN") return NaN;  return Number(token);} // 타입이 Value(합집합)라서 TS도 == 를 허락한다. string과 number로 좁혀진 두 값이면 TS2367 오류function looselyEqual(a: Value, b: Value): boolean {  return a == b;} const out: string[] = [];for (let i = 1; i <= n; i++) {  const [a, b] = lines[i].trim().split(" ").map(parse);  out.push(a === b ? "===" : looselyEqual(a, b) ? "==" : "!=");}console.log(out.join("\n"));