JavaScript 对象

1、字符串对象

  创建:

    s1="hello"  typeof s1 结果是string

    s2=new String("hello") typeof s2结果是object

    s3=`asdfsa

      sdfsdf` (``为ES6中多行文本的声明)方式)

  常用方法:

// ES6新增的字符串替换
var name = "sun";
var age = 23;
var s = `${name} is cute, age is ${age}` //必须是`符号才能替换
console.log(s); //结果是:sun is cute, age is 23
slice(start, stop)和substring(start, stop)的区别
相同点:
    如果start=stop,返回空字符串
    如果stop省略,则取到字符串末尾
   如果某个参数超过string的长度,这个参数会被替换为string的长度

substirng()的特点:
如果 start > stop ,start和stop将被交换
如果参数是负数或者不是数字,将会被0替换

silce()的特点:
如果 start > stop 不会交换两者,得到空字符串""
stop可以为负数,"abcdefg".slice(1,-5)结果事"b"
a.slice(-5,3),a.slice(-5,"asf"),a.slice(4,"asf")
以上三种得不到结果,且都不报错

强调:
使用slice和substring之前一定要慎重,一定要知道传的参数值
这两个函数都可以传字符串参数,不报错,

2、 数组对象

  创建

    var arrname = [];

    var arrname = new Array(元素1, 元素2,....)

    var arrname = new Array(n), 只有当n为数字时,表示数组的长度

var a = [1,2,3,4];
a.length //结果时4
a[6] = "abc";
console.log(a);
a的值变为[1,2,3,4,undefined, undefined, "abc"]

// 遍历数组的方法
//第一种
var a = [10, 20, 30, 40];
for (var i=0;i<a.length;i++) {
 console.log(a[i]);
}

// 第二种:不推荐使用
for (var index in arr) {
 console.log(a[index]);
}
在Javascript中,可以定义d={"name": "sun", "age": 24}
只不过存的值是object对象,d内但双引号都可以
遍历for(var i in d){console.log(i)}//i是key值

  常用方法:

   2.1 sort 用法

// 排序
// 1. 把元素的元素都转成字符串
// 2. 按照ASCII对应数值, 从小到大
// 3. 从最高位开始,如果相同,就看第二位
var arr = ['adf', 'b', 'rg', 'a', 'aef'];
arr.sort();
// 相当于arr = arr.sort()
// 返回值["a", "adf", "aef", "b", "rg", empty]

// 自定义可以排序数字
function intsort(a, b){
   return a-b;
}
var arr = [1,4,7, 3,2, true];
arr.sort(intsort);
// 结果是: [1, true, 2, 3, 4, 7]

//如果带有字符串
var arr = [5,3,7,2,'a','vvv',9,4,7,2,8];
arr.sort(intsort);
// 结果是:[2, 2, 3, 4, 5, 7, "a", "vvv", 7, 8, 9]
// 从结果上可以看出:排序的方法:插入法

  2.2 splice 用法

// 用法:
// arr.splice(start, deletenum, value)

//第一种用法:
var arr = [1,2, 4, 6, 8, 3, 4, 5] ;   
arr.splice(2,4);
// 返回值:[4, 6, 8, 3]
// arr的值为[1, 2, 4, 5]

// 第二种用法:
var arr = [1, 2, 4, 6, 8, 3, 4, 5] ;  
arr.splice(2,4, "abc");
// 返回值:[4, 6, 8, 3]
// arr的值为[1, 2, "abc", 4, 5]

// 第三种用法:直接插入数据
var arr = [1, 2, 4, 6, 8, 3, 4, 5] ;  
arr.splice(2,0, [3,4,5]);  // 可以插入多个数值
// 返回值:[4, 6, 8, 3]
// arr的值为[1, 2, [4, 6, 8, 3], 4, 5]

   2.3 push, pop, unshift, shift 用法

  2.4 forEach 用法

// 示例:
var arr = [111,222,333,444];
arr.forEach(function(value,index,arr){
   console.log(value, index, arr)
});

/*结果是打印如下内容:
111 0 [111, 222, 333, 444]
222 1 [111, 222, 333, 444]
333 2 [111, 222, 333, 444]
444 3 [111, 222, 333, 444]
*/

  2.5 map 用法

// 示例:
var arr = [111,222,333,444];
var newArr = arr.map(function(value,index,arr){
   return value+1;
});

// 结果:
// newArr的值[112, 223, 334, 445]
// arr的值不变

3、date 对象

  创建时间对象

//方法1:不指定参数
var d1 = new Date();
console.log(d1.toLocaleString());
console.log(d1.toUTCString());

// 打印的结果是:
//  2019/4/7 下午11:53:05
//  Sun, 07 Apr 2019 15:53:18 GMT
// d1的值是:Sun Apr 07 2019 23:53:18 GMT+0800 (中国标准时间)

// 方法2:传输时间格式字符串
var d2 = new Date("2019/3/20 11:12");
console.log(d2.toLocaleString());
var d3 = new Date("3/20/19 11:12"); // 格式和上面的不一样
console.log(d3.toLocaleString());

// 打印的结果是:
//2019/3/20 上午11:12:00
//2019/3/20 上午11:12:00

//方法3:时间戳
var d3 = new Date(0);
console.log(d3.toLocaleString());
console.log(d3.toUTCString());

// 打印的结果是:
// 1970/1/1 上午8:00:00
// Thu, 01 Jan 1970 00:00:00 GMT

// 方法4:参数为年月日时分秒毫秒
var d4 = new Date(2019,3,25,13,14,52,100);
console.log(d4.toLocaleString());  //毫秒并不直接显示

// 打印的结果是:
// 2019/4/25 下午1:14:52  // 日期+1

   方法 

4、math 对象

 

5、JSON 对象

JSON对象
var obj1 = {"name": "sun", "age": 23};
// 对象转换成JSON字符串
var str = JSON.stringify(obj1);
console.log(str);
// 结果:"{"name":"sun","age":23}"

// JSON字符串转换成对象
var newObj = JSON.parse(str);

6、RegExp 对象

// 定义正则表达式
// 当使用构造函数创造正则对象时,需要常规的字符转义规则(在前面加反斜杠 \)
var reg1 = new RegExp("^[a-zA-Z]\\w{5,9}");
var reg2 = /^[a-zA-Z]\w{5,9}$/;

//测试字符串是否是自己需要 的
reg1.test("sun123123");
reg2.test("sun123123");
// 结果:true true

// 正则表达式内表示范围的大括号内不能有空格,如下:
var reg = /^[a-zA-Z]\w{5, 9}$/;
reg.test("sun123123");
// 结果是:false

  修饰符


 

// 示例
// 定义全局匹配
var reg1 = new RegExp("is","g");
var reg2 = /is/g

var s1 = "Is this all there is?"
var res1 = s1.match(reg1);
var res2 = s1.match(reg2);
// 结果是:
// ['is', 'is']
// ['is', 'is']

// 全局且大小写不敏感
var res3 = s1.match(/is/gi);
// 结果是:['Is', 'is', 'is']

// 全局匹配是有一个lastIndex属性
var reg1 = new RegExp("\\w{3}","g");
reg1.test("sun");          //  结果是:true
reg1.lastIndex;    // 结果是:3
reg1.test("sun");  // 结果是:false
reg1.lastIndex;    // 结果是:3
// 检验是不传参数,默认是字符串"undefined"
var reg2 = var reg2 = /^[a-zA-Z][a-zA-Z0-9]{5,9}$/
reg2.test();
reg2.test(undefined);

var reg3 = /undefined/;
reg3.test();

var reg4 = new RegExp("undefined");
reg4.test();

// 以上结果全都是:true
// 正则一些使用:
    /^\d+$/  //非负整数(正整数 + 0) 
    /^[0-9]*[1-9][0-9]*$/  //正整数 
    /^((-\d+)|(0+))$/  //非正整数(负整数 + 0) 
    /^-[0-9]*[1-9][0-9]*$/  //负整数 
    /^-?\d+$/    //整数 
    /^\d+(\.\d+)?$/  //非负浮点数(正浮点数 + 0) 
    /^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$/  //正浮点数 
    /^((-\d+(\.\d+)?)|(0+(\.0+)?))$/  //非正浮点数(负浮点数 + 0) 
    /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/  //负浮点数 
    /^(-?\d+)(\.\d+)?$/  //浮点数 

// 去空格
    去除字符串内所有的空格:str = str.replace(/\s*/g,"");
    去除字符串内两头的空格:str = str.replace(/^\s*|\s*$/g,"");
    去除字符串内左侧的空格:str = str.replace(/^\s*/,"");
    去除字符串内右侧的空格:str = str.replace(/(\s*$)/g,"");

 

7、 函数对象

  定义方式

// 无参普通函数定义
function f1() {
 console.log("Hello world!");
}

// 带参数的函数
function f2(a, b) {
 console.log(arguments);  // 内置的arguments数组对象,把传入的所有参数都包含进去
 console.log(arguments.length);
 console.log(a, b);
}

f2(1,2,4,6,2);
// 结果
// [1, 2, 4, 6, 2]
// 5
// 1 2

// 带返回值的函数
// return只能返回一个值,如果想返回多个值需要把它们放到一个数组或对象中
function sum(a, b){
 return a + b;
}
sum(1, 2);  // 调用函数

// 匿名函数方式
var sum = function(a, b){
 return a + b;
}
sum(1, 2);

// 匿名函数的正确使用方式
(function(a, b){
 return a + b;
})(1, 2);
ES6新增定义方式
var f = v => v;
// 等同于
var f = function(v){
 return v;
}

var f = () => 5;
// 等同于
var f = function(){return 5};


var sum = (num1, num2) => num1 + num2;
// 等同于
var sum = function(num1, num2){
 return num1 + num2;  
}

  局部变量

    在JavaScript函数内部声明的变量(使用 var)是局部变量,只能在函数内部访问它,

    该变量的作用域是函数内部)。只要函数运行完毕,本地变量就会被删除。

  全局变量

    在函数外声明的变量是全局变量,网页上的所有脚本和函数都能访问它。

  变量生存周期:

    JavaScript变量的生命期从它们被声明的时间开始。

    局部变量会在函数运行以后被删除。

    全局变量会在页面关闭后被删除。

  作用域:

    首先在函数内部查找变量,找不到则到外层函数查找,逐步找到最外层。

    变量的值在定义阶段是就已经确定了,找作用域时一定要回到变量定义的地方

函数调用时发生了什么:

当函数调用的前一瞬间,会先形成一个激活对象:Avtive Object(AO),并会分析以下3个方面:
1:函数参数,如果有,则将此参数赋值给AO,且值为undefined。如果没有,则不做任何操作。
2:函数局部变量,如果AO上有同名的值,则不做任何操作。如果没有,则将此变量赋值给AO,并且值为undefined。
3:函数声明,如果AO上有,则会将AO上的对象覆盖。如果没有,则不做任何操作。

函数内部无论是使用参数还是使用局部变量都到AO上找。


posted @ 2019-04-14 00:01  yw_sun  阅读(134)  评论(1)    收藏  举报