确定值类型:typeof、instanceof、Object.prototype.toString

1、typeof运算符

返回类型:number、string、boolean、undefined、null、object、function

1.1 知识点补充:null 和 undefined的区别?

区别:
null:表示空值
undefined:未定义
Number(null) // 0 eg: nul + 5 // 5 Number(undefined) // NaN eg: undefined + 5 // NaN

1.2 boolean值

转换规则:除了下面6个值为false,其他均为true
null  undefined  0  ''或者""  false  NaN

注意:[] 和 {} 得到的bool值也为true

1.3 number

javaScript 语言没有整数,所有数字都是小数(64位浮点数)。

由于浮点数不是精确的数值,所以:

0.1 + 0.2 === 0.3   // false

0.3 / 0.1 // 2.9999999999999996

parseInt:将字符串转为整数

parseInt:将字符串转为整数
parseInt('123');     // 123

头部有空格,会被自动去除
parseInt('     81');    // 81

如果parseInt的参数不是字符串,则会先转为字符串再转换。
parseInt('1.23');  // 1

字符串转为整数的时候,是一个个字符依次转换,如果遇到不能转为数字的字符,就不再进行下去,返回已经转好的部分。
parseInt('8a') // 8
parseInt('12**') // 12
parseInt('12.34') // 12
parseInt('15e2') // 15
parseInt('15px') // 15 

如果字符串的第一个字符不能转化为数字(后面跟着数字的正负号除外),返回NaN

parseInt('abc') // NaN
parseInt('.3') // NaN
parseInt('') // NaN
parseInt('+') // NaN
parseInt('+1') // 1

parseFloat:方法用于将一个字符串转为浮点数。

如果参数不是字符串,或者字符串的第一个字符不能转化为浮点数,则返回NaN。
parseFloat([]) // NaN
parseFloat('FF2') // NaN
parseFloat('') // NaN

isNaN:方法可以用来判断一个值是否为NaN

isNaN只对数值有效,如果传入其他值,会被先转成数值。所以如果为true的话,有可能是NaN也有可能是字符串
isNaN(NaN) // true
isNaN(123) // false
isNaN('Hello') // true
// 相当于
isNaN(Number('Hello')) // true

 但是,对于空数组和只有一个数值成员的数组,isNaN返回false

isNaN([]) // false
isNaN([123]) // false
isNaN(['123']) // false

判断NaN更可靠的方法是,利用NaN为唯一不等于自身的值的这个特点,进行判断。

function myIsNaN(value) {
  return value !== value;
}

isFinite():isFinite方法返回一个布尔值,表示某个值是否为正常的数值。

isFinite(Infinity) // false
isFinite(-Infinity) // false
isFinite(NaN) // false
isFinite(undefined) // false
isFinite(null) // true
isFinite(-1) // true

除了Infinity-InfinityNaNundefined这几个值会返回falseisFinite对于其他的数值都会返回true

  

base64转码:

JavaScript 原生提供两个 Base64 相关的方法。

  • btoa():任意值转为 Base64 编码
  • atob():Base64 编码转为原来的值
var string = 'Hello World!';
btoa(string) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"
这两个方法不适合非 ASCII 码的字符,会报错。 btoa('你好') // 报错

要将非 ASCII 码字符转为 Base64 编码,必须中间插入一个转码环节,再使用这两个方法。

编码:btoa(encodeURIComponent('你好')); // "JUU0JUJEJUEwJUU1JUE1JUJE"
解码:decodeURIComponent(atob('JUU0JUJEJUEwJUU1JUE1JUJE'));      // 你好

  

对象:

对象指向的是同一个内存地址;
var obj1 = {};
var obj2 = obj1;
obj1.a = 1;
obj2.a;      // 1
变量不指向同一个内存地址 
var x = 1; 
var y = x;
x = 2;
y; // 1

查看一个对象本身的所有属性,可以使用Object.keys方法。

var obj = {
  key1: 1,
  key2: 2
};

Object.keys(obj);
// ['key1', 'key2']

属性的删除:delete 命令 

var obj = { p: 1 };
Object.keys(obj) // ["p"]

delete obj.p // true
obj.p // undefined
Object.keys(obj) // []

检查属性是否存在:in 运算符 

存在返回true,否则返回false

var obj = { p: 1 };
'p' in obj // true
'toString' in obj // true

in运算符的一个问题是,它不能识别哪些属性是对象自身的,哪些属性是继承的。就像上面代码中,对象obj本身并没有toString属性,但是in运算符会返回true,因为这个属性是继承的。

这时,可以使用对象的hasOwnProperty方法判断一下,是否为对象自身的属性。

var obj = {};
if ('toString' in obj) {
  console.log(obj.hasOwnProperty('toString')) // false
}

对象属性的遍历:for...in 循环

var obj = {a: 1, b: 2, c: 3};

for (var i in obj) {
  console.log('键名:', i);
  console.log('键值:', obj[i]);
}

在函数对象内修改某个参数,可以影响原对象,但是修改整个对象就不会影响原对象

修改对象中的某个值:因为指向同一个内存地址
var obj = { p: 1 };

function f(o) {
  o.p = 2;
}
f(obj);

obj.p // 2

修改整个对象,不会影响原对象数据,因为它重新对o赋值导致o指向另一个地址,保存在原地址上的值当然不受影响。
var obj = [1, 2, 3];

function f(o) {
  o = [2, 3, 4];
}
f(obj);

obj // [1, 2, 3]

arguments:由于 JavaScript 允许函数有不定数目的参数,所以需要一种机制,可以在函数体内部读取所有参数。

arguments对象包含了函数运行时的所有参数
argument[0]  第一个参数
argument[1]  第二个参数

这个对象只有在函数体内部,才可以使用。

var f = function (one) {
  console.log(arguments[0]);
  console.log(arguments[1]);
  console.log(arguments[2]);
}

f(1, 2, 3)

闭包:能够读取其他函数内部变量的函数

闭包的最大用处有两个,一个是可以读取外层函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。

 

IIFE:立即调用的函数表达式(Immediately-Invoked Function Expression);

var i = function(){ return 10; }();

eval:命令接受一个字符串作为参数,并将这个字符串当作语句执行。

eval('var a = 1;');     // 1

如果参数字符串无法当作语句运行,那么就会报错。
eval('3x') // Uncaught SyntaxError: Invalid or unexpected token

 

数组:

delete可以删除数组的元素,形成空位,但是不会影响数组的长度。
eg:
var a = [1, 2, 3];
delete a[1];

a[1] // undefined
a.length // 3

数组的某个位置是空位,与某个位置是undefined,是不一样的。如果是空位,使用数组的forEach方法、for...in结构、以及Object.keys方法进行遍历,空位都会被跳过。

如果是undefined,则不会跳过。

 

posted on 2021-02-25 20:12  liumcb  阅读(78)  评论(0编辑  收藏  举报