基本引用类型(原始值和引用值,数值与Number,字符串与String,布尔与Boolean)

一. 原始值和引用值:

1. 原始值:表示单一的数据,如10,“abc“,true等。
a. ES中有6种原始值:Number,String,Boolean,Null,Undefined,Symbol。
b. 所有基本类型的值都是不可改变的。但是要注意的是,基本类型本身和一个赋值为基本类型的变量的区别。变量会被赋值,为原始值不能像数组、对象及函数那样改变。基本类型的值可以替换,但不能改变。
// 基本类型
let foo = 5;
// 定义一个貌似可以改变基本类型值的函数
function addTwo(num) {
num += 2;
}
// 和前面的函数一样
function addTwo_v2(foo) {
foo += 2;
}
// 调用第一个函数,并传入基本类型值作为参数
addTwo(foo);
console.log(foo); // 5
// 尝试调用第二个函数…
addTwo_v2(foo);
console.log(foo); // 5
在执行函数体内语句之前,JavaScript会将传递进来的参数(基本类型的值)复制一份,创建一个本地副本。这个副本只存在于该函数的作用域中,我们能够通过指定在函数中的标识符访问到它。函数中的任何操作都不会影响到最初的foo,我们操作的只不过是它的副本。

c. 原始值不能有属性。
d. 每当用到某个原始值的方法时,后台会创建一个相应的原始值包装类型对象,从而暴露出操作原始值的各种方法。
let s1 = “hello world”;
let s2 = s1.substr(0,5);
后台执行步骤:
(1)创建一个包含了原始值的String类型的实例
(2)调用实例上的特定方法
(3)销毁实例
2. 引用值:表示有多个值(原始值或其他引用值)构成的对象。
a. ES不允许直接访问对象的内存空间。
b. 实际操作对象时,访问的是内存地址,即引用。
c. 引用类型通常叫做类(class),也就是说,遇到引用值所处理的就是对象。
d. 引用值(对象)可以随时添加,修改和删除它的属性和方法。
3. 确定类型:可通过typeof操作符来判断一个值的类型。对于引用值来说typeof的意义不大。通常采用instanceof操作符,判断引用值是否为某个构造函数的实例。

二. 数值与Number

1. 数值:
a. 特征:不区分整数和浮点数,所有数值都用浮点数值表示。
b. 算术运算
i. 溢出:当数值运算超过了JS能表示的数值上限时,其结果就为Infinity,若为负数范围则为-Infinity。Infinity的加减乘除的结果依然时Infinity。Infinity/Infinity的结果时NaN.
ii. 下溢:运算结果无限接近于零,并比JS能表示的最小值还要小时,会返回0,若为负数,则返回-0。
iii. 被零整除:0/0的结果是NaN
c. 数值转换:用Number(),parseInt(),parseFloat()来进行非数值转换为数值。
2. Number:时经过封装的能让你处理数字型的对象。Number对象由Number()构造器创建。
a. 创建一个Number对象的构造函数:let num = new Number(value);[value指被创建对象的数字值]
b. 如果参数无法被转换为数字,则返回NaN.
c. 在非构造器上下文中(没有new操作符),Number能被用来执行类型转换
d. 常用方法:
i. Number.isFinite():用于检查数值是否有限的(finite),参数类型不是数值,直接返回false。
console.log(Number.isFinite(15)); //true
console.log(Number.isFinite(5/0)); //false
console.log(Number.isFinite(Infinity));//false
console.log(Number.isFinite(NaN));//false
console.log(Number.isFinite(“foo”));//false
console.log(Number.isFinite(true));//false

ii. Number.isNaN():用于检查是否为NaN,参数不是NaN都返回false。
iii. Number.parseInt()与Number.parseFloat()和ES5的parseInt()与parseFloat()相同。
iv. Number.isInteger():用于判断是否为整数(integer)。
console.log(Number.isInteger(“14”));//false
console.log(Number.isInteger(12));//true
console.log(Number.isInteger(12.23));//false

v. Number.EPSILON:常量,表示1与大于1 的最小浮点数之间的差。
vi. toString():返回数值对象的字符串表示。
vii. toLocaleString():返回数值对象的字符串本地表示。
如:num = new Number(123456);
num.toString(); //”123456”
num.toLocaleString(); //”123,456”
viii. valueof():返回数值对象的原始数值。
ix. toFixed(n):返回包含指定小数位数的数值字符串(n为小数位数),会四舍五入。如:num=new Number(10.005); num.toFixed(2); //”10.01”
x. toExponential(n):返回科学记数法表示的数字字符串,会四舍五入。
如:num=123;
num.toExponential(1);//1.2e+2
num.toExponential(3);//1.230e+2
xi. toPrecision(n):返回数值最恰当的形式,会四舍五入。本质上,根据数值和精度来确定调用toFixed还是toExponential。
e. Number实例:所有Number实例都继承自Number.prototype。被修改的Number构造器的原型对象对全部Number实例都生效。
3. Math对象:
a. 舍入方法:
i. Math.ceil():向上取整
ii. Math.floor():向下取整
iii. Math.round():四舍五入
iv. Math.fround():放回数值最接近的单精度浮点数表示。
b. random():返回一个0-1之间的随机数,其中包含0但不包含1。
编写一个函数randomFrom(lower, upper)返回一个大于或等于lower且小于或等于upper的随机整数。Math.floor(Math.random( )*可选整数的总数+最小可能的整数),可从一个最小整数开始的一个范围内选择一个随机整数。
function randomFrom(lower,upper){
let num;
num=Math.floor(Math.random() * ((upper-lower) +1) + lower)
console.log(num)
}
randomFrom(3,5)

c. Marh.trunc():用于去除一个数的小数部分,返回整数部分。非数值先用Number()转换数值后再操作,对于控制和无法截取整数的值,返回NaN.
d. Math.sign():用于判断一个数是正数、负数还是零,非数值先转换再操作。
i. 正数:+1;负数:-1;
ii. 0:0;-0:-0;
iii. 其他值:NaN
iv. Math.sign(false); // 0 Math.sign(true); // 1
e. Math.cbrt():计算一个数的立方根。
f. Math.hypot():计算所有参数的平方和的平方根。Math.hypot(3,4);// 5 [33+44=25 开方得5]
4. BigInt:是一种内置对象,他提供了一种方法来表示大于 253 - 1 的整数。原本是JavaScript中可以用Number表示的最大数字。BigInt可以表示任意大的整数。

三. 布尔与Boolean:

1. 转换方式:
a. 使用Boolean()转换
b. 隐式转换:
let x = 100;
let y = null;
let z;
if (x) {
console.log(x);
}
if (y != null) {
console.log(y);
}
if (z) {
console.log(z);
}

四. 字符串与String:

1. 字符串:是一组由16位值组成的不可变的有序序列,每个字符通常来自于Unicode字符集。字符串的长度(length)使其所含16位值的个数。
a. 字面量:
i. 由单引号或双引号括起来的字符序列。
ii. 单双引号可以嵌套,由最外围引号定界字符串。
iii. 如:“this is a ‘dog’!”
iv. 字符串字面量可以拆分成数行,每行必须以反斜线(\)结束,且反斜线都不计入字符串的内容。
b. 转义字符:
i. 由单引号或双引号括起来的字符序列。
ii. 单双引号可以嵌套,由最外围引号定界字符串。
iii. 如:“this is a ‘dog’!”
iv. 字符串字面量可以拆分成数行,每行必须以反斜线(\)结束,且反斜线都不计入字符串的内容。
c. 字符的Unicode表示法
i. JavaScript允许采用\uxxxx形式表示一个字符。
ii. 其中,xxxx表示字符的Unicode编码。如:”\u0061”表示“a”
iii. 这种编码仅能表示\u0000~\uFFFF之间的字符。超出这个范围的字符,必须采用2个双字节的形式表示。
iv. 如:”\uD842\uDFB7”表示“𠮷”
v. 超过这个范围的编码则会被截取。
vi. 如:”\u20BB7” //“₻7”
vii. ES6提出了改进方案
viii. 利用大括号将整个编码括起来,从而识别为一个字符。
ix. 如:”\u{20BB7}” //”𠮷”
x. 如:”\u{20BB7}”===“”\uD842\uDFB7” //true
2. String:全局对象是一个用于字符串或一个字符序列的构造函数。
a. 直接调用String():将参数转换为字符串,返回字符串原始值。
b. 作为构造函数:通过new调用String(),则会返回一个字符串对象。
let x = 100;
console.log(typeof String(x));//string
console.log(typeof new String(x));//object
c. 字符串对象:
i. ES5:
let s=“Hello, Javascript”;
s.charAt(0) //返回在指定位置的字符
s.charAt(s.length-1) //
s.substring(1, 4) //提取字符串中两个指定的索引号之间的字符
s.slice(1, 4) //提取字符串的片段,并在新的字符串中返回被提取的部分
s.slice(-3) //从后面开始截取
s.substr(2, 3) //从起始索引号提取字符串中指定数目的字符
s.indexOf(“l”) //检索字符串,指定字符串首次出现的位置
s.lastIndexOf(“l”) //从后向前搜索字符串
s.indexOf(“l”, 3) //3为在字符串中开始检索的位置
s.split(“, “) //把字符串分割为数组[ ‘Hello’, ‘Javascript’ ]
s.replace(“s”, “S”) //替换与正则表达式的子串Hello, JavaScript
s.concat(“!”) //连接字符串
s.toUpperCase( ) //转换为大写
“ abc “.trim( ) //删除字符串开始和末尾的空格
ii. ES6:
let s = String(“\u{20bb7}”);
let c0 = s.charCodeAt(0) //返回指定位置的字符串的Unicode编码,无法正确返回4个字节存储的字符。
let c1 = s.charCodeAt(1) //
let point = s.codePointAt(0) //返回指定位置的字符串的Unicode编码,能正确返回4个字节存储的字符。该方法定义在字符串的实例对象上。
String.fromCharCode(point) //将Unicode编码转义为字符 ,但是不能识别大于0xFFFF的字符
String.fromCharCode(c0, c1) //
String.fromCodePoint(point) //将Unicode编码转义为字符 ,可以识别大于0xFFFF的字符,该方法定义在String对象上。

let c=“Hello world!”;
c.includes(“or”) //是否找到了参数字符串,返回布尔值
c.includes(“Hello”, 6) //第二个参数表示开始查找的位置
c.startsWith(“He”) //参数字符串是否在头部
c.endsWith(“d”) //参数字符串是否在尾部
c.endsWith(“Hello”, 5) //第二个参数表示前n个字符
c.repeat(2) //将原字符串重复n次,并返回一个新的字符串,参数一定为正数,小数取整,其他报错。
c.repeat(0)
“x”.padStart(5, “ab”) //
“x”.padStart(4, “ab”) //如果原字符串不够指定长度,在头部补全,第二个参数指定的字符
“x”.padEnd(5, “ab”) //如果原字符串不够指定长度,在头部补全,第二个参数指定的字符
“xxx”.padStart(2, “ab”)
“xx”.padStart(4, “123”)
//如果原字符串的长度,等于或大于最大长度,则字符串补全不生效,返回原字符串。
如果用来补全的字符串与原字符串,两者的长度之和超过了最大长度,则会截去超出位数的补全字符串。
如果省略第二个参数,默认使用空格补全长度。

String.raw():返回一个斜杠都被转义(即斜杠前再加一个斜杠)的字符串。
3. 字符串的遍历器接口:
a. ES6为字符串添加了遍历器接口,使得字符串可以被for…of循环遍历。除了遍历字符串,这个遍历器最大的优点是可以识别大于0xFFFF的码点,传统的for循环无法识别这样的码点。
b. let text = String.fromCodePoint(0x20BB7);
for (let i of text) {
console.log(i);
}// “𠮷”
4. 模板字符串:是允许嵌入表达式的字符串字面量。
a. 用反引号()来代替普通字符串的单双引号。模板字符串可以包含特定语法(${expression})的占位符。占位符中的表达式和周围的文本会一起传递给一个默认函数,该函数负责将所有的部分连接起来,如果一个模板字符串由表达式开头,则该字符串被称为带标签的模板字符串,该表达式一般是一个函数,他会在模板字符串处理后被调用,在输出最终结果前,你都可以通过该函数来堆模板字符串进行操作处理。在模板字符串内使用反引号时,要在前面加转义符(\)。
b. 多行字符串:
i. 普通字符串表达:
console.log(‘string text line 1\n’ +
‘string text line 2’);
// “string text line 1
// string text line 2”
ii. 模板字符串表达:
console.log(string text line 1 string text line 2);
// “string text line 1
// string text line 2”
c. 插入表达式:
i. 普通字符串表达:
var a = 5;
var b = 10;
console.log(‘Fifteen is ’ + (a + b) + ’ and\nnot ’ + (2 * a + b) + ‘.’);
// “Fifteen is 15 and
// not 20.”
ii. 模板字符串表达:
var a = 5;
var b = 10;
console.log(Fifteen is ${a + b} and not ${2 * a + b}.);
// “Fifteen is 15 and
// not 20.”
d. 嵌套模板:在某些时候,嵌套模板是具有可配置 字符串的最简单也是更可读的方法。在模板中,只需要在模板内的占位符${ }内使用,就可以更容易的使用内部反引号。
i. 如果条件a是真的,那么返回这个模板化的文字。
var classes = ‘header’
classes += (isLargeScreen() ? ‘’ : item.isCollapsed ? ’ icon-expander’ : ’ icon-collapser’);
e. 标签模板:字符串可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串。它并不是模板,而是函数调用的一种特殊形式。标签就是函数,模板字符串就是函数的参数。
i. 如果模板字符串中有变量,就要将模板字符串先处理成多个参数,在调用函数。
let [a,b] = [5,10];
function tag(stringArr,p1,p2){
console.log(stringArr,p1,p2);
console.log(stringArr.raw);//raw属性保存了转义后的原字符串
}
tagx = ${ a }\n y= ${ b };
ii. 标签函数并不一定要返回一个字符串。
function template(strings, …keys) {
return (function(…values) {
var dict = values[values.length - 1] || {};
var result = [strings[0]];
keys.forEach(function(key, i) {
var value = Number.isInteger(key) ? values[key] : dict[key];
result.push(value, strings[i + 1]);
});
return result.join(’’);
});
}

var t1Closure = template${0}${1}${0}!;
t1Closure(‘Y’, ‘A’); // “YAY!”
var t2Closure = template${0} ${'foo'}!;
t2Closure(‘Hello’, {foo: ‘World’}); // “Hello World!”
f. 原始字符串:
i. 在标签函数的第一个参数中,存在一个特殊的属性raw,我们可以通过它来访问模板字符串的原始字符串,而不经过特殊字符的替换。
function tag(strings) {
console.log(strings.raw[0]);
}

tagstring text line 1 \n string text line 2;
// logs “string text line 1 \n string text line 2” ,
// including the two characters ‘’ and ‘n’
ii. 使用String.raw()方法创建原始字符串和使用默认模板函数和字符串连接创建是一样的。
var str = String.rawHi\n${2+3}!; // “Hi\n5!”
str.length; // 6
str.split(’’).join(’,’); // “H,i,,n,5,!”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值