数据类型相关面试题解析

101 阅读1分钟
let str = 100 + true + 21.2 + null + undefined + 'Tencent' + [] + null + 9 + false;

/**
 * 解析
 * 100 + true == 100 + Number(true) == 100 + 1 = 101;
 * 101 + 21.2 = 122.2;
 * 122.2 + null == 122.2 + Number(null) == 122.2 + 0 = 122.2;
 * 122.2 + undefined = 122.2 + Number(undefined) == 122.2 + NaN = NaN //任何数值和NaN运算等于NaN
 * NaN + 'Tencent' = 'NaNTencent' // 字符串拼接
 * NaNTencent + [] = 'NaNTencent' // 空数组转换为字符串为空字符串
 * 'NaNTencent' + null = 'NaNTencentnull';
 * 'NaNTencentnull' + 9 = 'NaNTencentnull9';
 * 'NaNTencentnull9' + false = 'NaNTencentnull9false'
 */
[] == false; // true;
![] == false; // true;

/**
 * 把其他类型转换为布尔类型遵循的规律: 只有 0/NaN/null/undefined/"" 五个值是false, 其余都是true
 */
{} + 0 ? alert('ok') : alert('no'); // 'no'
0 + {} ? alert('ok') : alert('no'); // 'ok'

/**
 * 大括号{} 在运算符前面
 * 1. 在没有使用小括号处理优先级的情况下,不认为是数学运算,加小括号才算
 * 2. 出现在运算符的后面,认为是数学运算
 */
// example 1
var a = {}, b = '0', c = 0;
a[b] = '你好';
a[c] = '吃饭';
console.log(a[b]); // '吃饭'
/**
 * 解析:
 * a['0'] == a[0] 值会被替换
 */

// –––––––––––––––––––––––––––––––––––
// example 2
var a = {}, b = Symbol('1'), c = Symbol('1');
a[b] = '你好';
a[c] = '吃饭';
console.log(a[b]); // '你好'

/**
 * 解析:
 * Symbol 会创建唯一的值,所以 b 和 c 不相等,a[b] != a[c] 
 * 那么 a[b] == '你好'
 */

// –––––––––––––––––––––––––––––––––––
// example 3
var a = {}, b = {a:'1'}, c = {m:'2'};
a[b] = '你好'; 
a[c] = '吃饭';
console.log(a[b]); // '吃饭'

/**
 * 解析:
 * a[b] == a['[object Object]'] 
 * a[c] == a['[object Object]']
 * 所以会指向同一个属性值
 * 最终a[b]结果为'吃饭'
 */
 
/**
 * 在JS中对象的属性名是什么格式的?
 * 普通对象的属性名只能是“字符串” (普通对象的属性名可以是基本数据类型值)
 * Map 这种数据结构支持 对象作为属性名
 *
 *
 * 但是普通对象的属性名不能是对象,如果是对象,需要转换为字符串存储'[object Object]'
 * 普通对象转换为字符串是通过调用Object.prototype.toString(检测数据类型)
 */