05-JS基础(对象方法)

javascript基础五

对象

JavaScript 中的所有事物都是对象:字符串、数值、数组、布尔、日期、数学和正则表达式、函数...

JavaScript 提供多个内建对象,比如 String、Date、Array 等等。

对象,是封装了一些属性和方法的集合,是带有属性和方法的特殊数据类型

此外,JavaScript 允许自定义对象。

在JavaScript中 所有的对象都是函数 所有的函数也可以称为"对象"

创建对象的方法:

通过Object对象new创建:

var obj = new Object();
        var obj1 = new Object();
        // 对象是有方法和属性的  动态添加
        obj.name = '张三';
        obj.sex = 0;
        obj.age = 20;
        obj.say = function () {
            // this ==> 在这里指向obj实例对象本身
            alert(this.name);
        }
        obj1.name = '李四';
        // 怎么用?
        obj.say();
        alert('手动弹出==>'+obj.name);
        alert('手动弹出2==>'+obj1.name);

通过字面量形式创建对象:

// 通过字面量形式创建对象

//方法一:
        var obj = {};//创造一个对象
        // 添加属性和方法
        obj.name = '张三';
        obj.age = 20;
        obj.say = function () {
            alert(this.name+'的年龄为:'+this.age);
        }
        alert('手动弹出name:'+obj.name);
        obj.say();
//方法二:
        // 键值对  key:value  key=value
        // 这是zs的一个实例对象
        var zs = {
            name:'张三',
            age:20,
            sex:0,
            run:function () {
                alert('Hi , i can  running...');
            }
            sing: function () {
                alert('Hi i am '+ this.name);
            }
        };

        alert('手动弹出属性为===>'+zs.name);
        zs.say();

函数创造对象:

// 在js中 所有的对象都是函数 所有的函数也可以称为"对象"
// 此时 这个Human为手动创建的自定义构造函数对象
// 在js中 this的指向在调用前是不确定的.
function Human () {
            this.name = '张三';
            this.age = 20;
            this.say = function () {
                alert(this.name+'的年龄为:'+this.age);
            }
        }
        // zs为通过Human创建的一个实例对象
        var zs = new Human();
        // 通过zs的实例对象调用的属性 和方法
        alert('手动弹出name==>'+zs.name);
        zs.say();

this指向问题:

  • this只出现在函数中

  • 构造函数对象的this指向new出来的实例对象,即:==this指向调用者==.(面试)

  • 注意:如果没有实例化构造函数直接调用,会导致this指向整体运行对象window,进而影响函数值被重置

    //案例
    // script 有一个整体的运行对象window对象
    //而window对象作为网页js的默认运行环境,一般不写.
    //如果不通过new实例对象,那么this指向调用者
    //直接调用Human()自定义构造函数对象导致:
    //this.name==>windows.this,即windows对象本身
    //this.name被重新赋值变成张三
          // this在调用之前 是不知道指向谁的
          // 面试: 1. 构造函数对象的this指向new出来的实例对象
          var name = '李四';
          function Human () {
              this.name = '张三';
              this.age = 20;
              this.say = function () {
                  alert(this.name+'的年龄为:'+this.age);
              }
          }
            Human();
            alert(name);//弹出张三.
    

new的作用:

  • 开辟内存空间,存储新创建的对象( new Object() )
  • 把this设置为当前对象
  • 执行内部代码,设置对象属性和方法
  • 返回新创建的对象 ==<面试重要>==

JSON和JS对象:

JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧。

JSON 是 JavaScript 原生格式,JavaScript 中处理 JSON 数据不需要任何特殊的 API 或工具包。

它是一种严格的js对象的格式,JSON的属性名必须有双引号,如果值是字符串,也必须是双引号;

JSON 与 JS 对象的关系:

  • JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串

    //这是一个对象,注意键名也是可以使用引号包裹的
    var obj = {a: 'Hello', b: 'World'};
    //这是一个 JSON 字符串,本质是一个字符串
    var json = '{"a": "Hello", "b": "World"}';
    
  • JSON 和 JS 对象可以相互转换:

    //js对象转换为JSON
    //要实现从对象转换为 JSON 字符串,使用 JSON.stringify() 方法:
    var json = JSON.stringify({a: 'Hello', b: 'World'});
    console.log(json);//结果是 '{"a": "Hello", "b": "World"}'
    
    
    //JSON转换为JS对象:JSON实际上就是字符串
    //要实现从 JSON 转换为对象,使用 JSON.parse() 方法:
    var obj = JSON.parse('{"a": "Hello", "b": "World"}');
    console.log(obj);//结果是 {a: 'Hello', b: 'World'}
    
    
  • JSON 和 JS 对象遍历:

    • 在js中,for……in用于遍历一个对象的属性,把对象的属性名和属性值都提出来。

    • 直接根据键获取值时,obj["name"]和obj.name两种方法均可以获取到值。

    • [ ]可以使用变量作为参数,在实际使用过程中非常灵活,比如可以写出很通用的代码,而不用考虑具体对象的结构,多用于for (var key in obj) {}。

    //对象
              var user = {
                  name:'张三',
                  age: 20
              }
              // json类型对象
              var userJson = {
                  "name":"李四",
                  "age":30
              }
    //遍历
              for(var i in user){
                  // console.log(i); name,age
                  //xx.xx 这种形式 只能取原来具有的属性
                  //非常重要! xx.abc  abc是变量,就必须通过  xx[abc] 形式取值
                  console.log('属性'+i+'==>'+user[i]);
              }
    
              for(var a in userJson){
                  console.log('属性'+a+'==>'+userJson[a]);
              }
    

数组和字符串高阶API

数组的内置方法

将数组转换为字符串

toString()方法:
var arr = ["a","b","c","d"];
console.log(arr.toString()); //输出a,b,c,d
join()方法:
var arr = [1,3,5,6,7];
        //join可以把数组转换为字符串.
        //如果没有参数 默认逗号隔开
        var str = arr.join('!');
        console.log(str);//控制台输出1!3!5!6!7

翻转数组

  • reverse()方法:
    //方法用于颠倒数组中元素的顺序。
    //该方法会改变原来的数组,而不会创建新的数组。
    var arr = [10,11,1,3,5,7,9];
           console.log(arr.reverse()); //输出9,7,5,3,1,11,10
    

数组排序

sort() 方法:

该方法会改变原来的数组,而不会创建新的数组。

如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:

若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。

若 a 等于 b,则返回 0。

若 a 大于 b,则返回一个大于 0 的值。

function sortNumber(a, b)
    {
    return a - b //正序,b - a 倒序也可以用reverse()
    }
   var arr = new Array(6)
   arr[0] = "10"
   arr[1] = "5"
   arr[2] = "40"
   arr[3] = "25"
   arr[4] = "1000"
   arr[5] = "1"
  
   document.write(arr + "<br />")
   document.write(arr.sort())
    //输出结果为:
    //10,5,40,25,1000,1
    //1,10,1000,25,40,5

参数为arr.sort(sortNumber)时:

//基本数据类型:    
function sortNumber(a, b)
    {
    return a - b
    }
    var arr = new Array(6)
    arr[0] = "10"
    arr[1] = "5"
    arr[2] = "40"
    arr[3] = "25"
    arr[4] = "1000"
    arr[5] = "1"

    document.write(arr + "<br />")
    document.write(arr.sort(sortNumber))
    //输出结果为:
        //10,5,40,25,1000,1
        //1,5,10,25,40,1000


//复杂数据类型:
        var users = [
            {
                name:'张胜男',
                age:20,
                height: 180
            },
            {
                name:'李四',
                age:22,
                height: 170
            },
            {
                name:'王五',
                age:18,
                height: 172
            },
            {
                name:'赵六',
                age:22,
                height: 168
            }
        ]
        // 要求: 按照年龄和身高升序排列. 如果年龄相同,比较身高.
        // 对象数组的多条件排序
        users.sort(function (a,b) {
            //比较年龄 排序
            if(a.age==b.age){
                return a.height - b.height;
            }
            return a.age-b.age;
        });

        console.log(users);//先按年龄升序,如果年龄相同也按升序排列

查找数组中某个值在数组中对应的位置(下标)

indexOf()方法:
//indexOf()方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。
//indexOf(a,b);
//a表示,要查找的元素
//b表示,开始查找的位置。如果该索引值大于或等于数组长度,意味着不会在数组里查找,返回-1。如果参数中提供的索引值是一个负值,则将其作为数组末尾的一个抵消,即-1表示从最后一个元素开始查找,-2表示从倒数第二个元素开始查找 ,以此类推。 注意:如果参数中提供的索引值是一个负值,并不改变其查找顺序,查找顺序仍然是从前向后查询数组。如果抵消后的索引值仍小于0,则整个数组都将会被查询。其默认值为0.
var array = [2, 5, 9];
array.indexOf(2);     // 0
array.indexOf(7);     // -1
array.indexOf(9, 2);  // 2
array.indexOf(2, -1); // -1
array.indexOf(2, -3); // 0
lastIndexOf() 方法:
//lastIndexOf() 方法返回指定元素(也即有效的 JavaScript 值或变量)在数组中的最后一个的索引,如果不存在则返回 -1。从数组的后面向前查找,从 b 处开始.
//lastIndexOf(a,b);
//a表示,被查找的元素。
//b表示,从此位置开始逆向查找。默认为数组的长度减 1,即整个数组都被查找。如果该值大于或等于数组的长度,则整个数组会被查找。如果为负值,将其视为从数组末尾向前的偏移。即使该值为负,数组仍然会被从后向前查找。如果该值为负时,其绝对值大于数组长度,则方法返回 -1,即数组不会被查找。
var array = [2, 5, 9, 2];
var index = array.lastIndexOf(2);
// index is 3
index = array.lastIndexOf(7);
// index is -1
index = array.lastIndexOf(2, 3);
// index is 3
index = array.lastIndexOf(2, 2);
// index is 0
index = array.lastIndexOf(2, -2);
// index is 0
index = array.lastIndexOf(2, -1);
// index is 3

截取数组

slice()方法:

从当前数组中截取一个新的数组,不影响原来的数组

slice($1, $2) 并非在原数组上操作,而是返回被切部分的副本。区间表示为[$1, $2)$1 是起始下标,$2 是截止下标。

slice(0)==>创建一个数组的clone(克隆)对象

svar arr = [1,2,3,4,5];
        //截取一个数组 [)  
        var rs = arr.slice(1,3);
        //从下标为2开始
        var rs2 = arr.slice(2);
        // 有什么用类? 注意!
        // var rs3 = arr; // 还是同一个对象 
        // 一般用于数组clone
        var rs3 = arr.slice(0); // 创建一个数组的clone(克隆)对象
        console.log(rs); //[2 , 3]
        console.log(rs2);//[3, 4, 5]
        console.log(rs3);//[1, 2, 3, 4, 5]
splice()方法:

删除或替换当前数组的某些项目

splice($1, $2) 直接在原数组上操作,返回被切掉的部分。区间表示为 [$1, $1+$2-1]$1 是起始下标, $2 是切多少个。

var arr = [1,3,5,7];
        var arr2 = [1,2,3,4,5];
        var arr3 = [1,2,3,4,5];
        var arr4 = [1,2,3,4,5];
        //从下标为2的位置开始 替换1位,替换为8
        arr.splice(2,1,8);  // 常用
        arr2.splice(2,2,8);
        arr3.splice(2,1,['a','b','c']); // 二维数组
        arr4.splice(2,1,'a','b','c'); //  常用
        console.log(arr); // [1, 3, 8, 7]
        console.log(arr2); // [1, 2, 8, 5]
        console.log(arr3); // [1, 2, Array(3), 4, 5]
        console.log(arr4);// [1, 2, "a", "b", "c", 4, 5]

清空数组的方法

array.length = 0;
  • 更直接,在方法内可以直接影响方法外的数组.
  • length属性可以赋值,其它语言中length是只读
array=[];
  • 更简便,但是不彻底,在方法内使用时,==不会影响方法外的数组==

字符串方法

获取某个字符在字符串中的位置

indexOf()

字符串中的字符被从左向右索引,首字符的索引(index)为 0。

指定值的第一次出现的索引; 如果没有找到 -1。

indexOf() 方法对大小写敏感!

"Blue Whale".indexOf("Blue");     // returns  0
"Blue Whale".indexOf("Blute");    // returns -1
"Blue Whale".indexOf("Whale", 0); // returns  5
"Blue Whale".indexOf("Whale", 5); // returns  5
"Blue Whale".indexOf("", 9);      // returns  9 为空时遍历定义的数组长度
"Blue Whale".indexOf("", 10);     // returns 10 
"Blue Whale".indexOf("", 11);     // returns 10 超过数组长度返回数组最大长度
lastIndexOf()

字符串中的字符被从左向右索引。首字符的索引(index)是 0,

最后一个字符的索引,返回指定值在调用该方法的字符串中最后出现的位置,如果没找到则返回 -1。

"canal".lastIndexOf("a")   // returns 3
"canal".lastIndexOf("a",2) // returns 1
"canal".lastIndexOf("a",0) // returns -1
"canal".lastIndexOf("x")   // returns -1

截取字符串

slice()

可提取字符串的某个部分,并以新的字符串返回被提取的部分。

提取后不影响原副本

var str="Hello happy world!"
//提取从位置 6 开始的所有字符:
document.write(str.slice(6));//happy world!
//提取从位置 6 到位置 11 的所有字符:
document.write(str.slice(6,11));//happy

substr()

方法返回一个字符串中从指定位置开始到指定字符数的字符。范围大

截取后不影响原副本

var str="Hello world!"
document.write(str.substr(3));//lo world!
document.write(str.substr(3,7))//lo worl
substring()

方法返回一个字符串中介于两个指定下标之间的字符。范围小

截取后不影响原副本

var str="Hello world!"
document.write(str.substring(3));//lo world!
document.write(str.substring(3,7));//lo w

连接字符串

concat()

用的比较少,一般用+号拼接字符串

var str1 = '   hello,world! ';
var str2 = 'abcdefdaf';
console.log(str1.concat(str2)); //拼接等同console.log(str1+str2);

获取指定位置的信息

charAt()

可返回指定位置的字符。

字符串中第一个字符的下标是 0。如果参数 index 不在 0 与 string.length 之间,该方法将返回一个空字符串。

var str="Hello world!"
document.write(str.charAt(1));//e
charCodeAt()

返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数。

charCodeAt() 与 charAt() 方法执行的操作相似,只不过前者返回的是位于指定位置的字符的编码,而后者返回的是字符子串。

var str="Hello world!"
document.write(str.charCodeAt(1));//101
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容