JavaScript入门 对象检查数据类型/原型链/class类 Day19

对象检查数据类型

基本数据类型

  • typeof

复杂数据类型

  • instanceof     实例对象 instanceof 类型  匹配打印true
  • Array  Date  ->  Object 

数组类型

  • Array.isArray(obj) -> true | false 
     function test1(){
                let num = 100
                let str = 'hello'
                console.log( typeof num)
                console.log( typeof str)
    
                let obj = {name:'jack'}   //Object
                console.log(typeof obj)  // object
    
                let arr = [1,2]          // Array
                console.log(typeof arr) // object
    
                let date = new Date()
                console.log( typeof date) // object  Date
            }
            // test1()
            function test2(){
                let obj = {name:'jack'}
                let arr = [1,2]   
                let date = new Date()
                // obj instanceof Array  -> true | false
                console.log( date instanceof Array  )
            }
            // test2()
            function test3(){
                let obj = {}
                let arr = [1,2]
                console.log(  Array.isArray(obj) )
            }
            test3()

原型链 

显示原型和隐式原型

  • prototype是构造函数都有的属性,称为显示原型
  • ___proto__是每个对象都有的属性,又称为隐式原型
  • 但是,___proto__不是一个规范属性,只是部分浏览器实现了此属性,对应的标准属性是[[Prototype]]
  • * 每个对象都有一个__proto__属性指向它的原型 *
  • 原型对象也是一个对象, 原型对象也有__proto__指向它的原型

什么是原型链

多个原型通过隐藏__proto__连接起来,形成的一种链式结构,称为原型链.

原型链作用 

访问对象属性或方法时,会沿着原型链上的所有原型进行查找,至到根null为止

  • 属性和方法共享 
  • 继承

class类[ES6新增]

ES6新增的面向对象语法

解决: 使用构造函数和原型定义对象属性方法问题更加简易

语法

创建对象之前, 一般先定义对象的类型, 在类型中定义属性和方法

先类型再有对象

 class 类名{
// 构造器 -> 私有
 constructor(name,age){
 //属性和方法
 this.name = name
 this.age = age
}
 // 方法 -> 原型->公共
say(){
                      
     }
}
let p = new 类名(name,age)
 // ES5面向对象
			function Person(name, age) {
				this.name = name
				this.age = age
			}
            Person.prototype.say = function(){
                console.log('说话');
            }
			/*
                创建人类,它有姓名name,年龄age属性
            */
			class Person {
                // 私有
				constructor(name, age) {
					this.name = name
					this.age = age
				}
                // 公共
                say(){
                    console.log('说话');
                }
			}
			let p = new Person('jack', 18)
			console.log(p.name, '  ', p.age)
            console.dir(Person.prototype);
            console.dir(p);

 考试部分

/* 
  假设:编写一个方法,求一个字符串的字节长度。 一个英文字符占用一个字节,一个中文字符占用两个字节
    分析: 
       要点: 中文字符unicode编码大于255
               hello
               01234
               字符串.charCodeAt(索引号)

       思路:  原字符串长度保存到变量bytes中。 
              遍历字符串,判断字符,如果字符是中文字符bytes++。

        let str = 'hello大家好'
        let count = 0 //统计字节长度

        for(let i = 0; i < str.length; i++){
            let code = str.charCodeAt(i)
            if(code > 255){
                count += 2
            }else{
                count++
            }
        }
*/
function GetBytes(str) {
	var len = str.length
	var bytes = len
	for (var i = 0; i < len; i++) {
		if (str.charCodeAt(i) > 255) bytes++
	}
	return bytes
}

/**
 * 利用欧几里得算法(辗转相除法)编写一个函数gcd(x,y) 求最大公约数,编写一个函数lcm(x,y)求最小公倍数
 
 1.最大公约数
    递归的方式:
    首先确定如何求最大公约数,我们采用欧几里得算法(辗转相除法),算法描述如下:
    例:48,57
    57%48=9     大数对小数求余
    48%9=3       小数对上次的余数求余,重复这个过程直到余数为0

    9%3=0         余数为0时,此次求余的小数就是最大公约数

 2.最小公倍数
  定理:x、y 两个数的最小公倍数乘以它们的最大公约数等于 x 和 y 本身的乘积。
 
  即LCM(x,y)=(x*y)/GCD(x,y)

 */
function gcd(x, y) {
	let max = x > y ? x : y
	let min = y < x ? y : x
	if (max % min == 0) {
		//如果能整除,小数就是最大公约数
		return min
	} else {
		return gcd(min, max % min)
	}
}

function lcm(x, y) {
	return (x * y) / gcd(x, y)
}

/*
	随机颜色值
		颜色值:   RGB      Red   Green    Blue
						0-255  0-255    0-255
						RGB(156,240,210)
				十六进制
				0 - 9  A B C D E F 
				#A35EB1
*/

function getRandom16Color() {
	var r = getRandom(0, 256)
	var g = getRandom(0, 256)
	var b = getRandom(0, 256)

	var r1 = r.toString(16)
	r1 = r1.length == 1 ? '0' + r1 : r1
	var g1 = g.toString(16)
	g1 = g1.length == 1 ? '0' + g1 : g1
	var b1 = b.toString(16)
	b1 = b1.length == 1 ? '0' + b1 : b1

	var rgbColor = `#${r1}${g1}${b1}` // #0abc02

	document.querySelector('div').style.backgroundColor = rgbColor
}
getRandom16Color()

/**
 * RGB随机颜色
 */
function getRandomRGBColor() {
	var r = getRandom(0, 256)
	var g = getRandom(0, 256)
	var b = getRandom(0, 256)
	var rgb = `rgb(${r},${g},${b})`
	document.querySelector('div').style.backgroundColor = rgb
}

/**
 * 生成m-n之间随机数
 * @param {*} m 
 * @param {*} n 
 * @returns 
 */
function getRandom(m, n) {
	var max = Math.max(m, n)
	var min = Math.min(m, n)
	return Math.floor(Math.random() * (max - min) + min)
}
function mhy(){
            var str = 'jt编程实现学生表格显示'
            var count = 0
            for(var i = 0; i < str.length ;i++){
                if(str.charCodeAt(i) > 255){
                    count += 2
                }
                else{
                    count += 1
                }
            }
            console.log('字符串长度为:',count)
        }
        mhy()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值