第二章

1.如果我们在控制台中执行下列语句,结果分别是什么?为什么?

var a; typeof a;   undefined
> var s = '1s'; s++; NaN
> !!"false"; true
> !!undefined; false
> typeof -Infinity; number
> 10 % "0"; NaN
> undefined == null; true
> false === ""; false
> typeof "2E+2"; string
> a = 3e+3; a++; 3000

2.执行下面的语句后,v 的值会是什么?

var v = v || 10; 如果将v 分别设置为100、0、null,结果又将是什么?

100, 10, 10

3.编写一个打印乘法口诀表的脚本程序。提示:使用嵌套循环来实现。

for (let i = 1; i < 10; i++) {
for (let j = i; j < 10; j++) {
console.log(i + '*' + j + '= '+ i*j);
}
}

第三章

1.编写一个将十六进制值转换为颜色的函数,以蓝色为例,#0000FF 应被表示成 rgb(0,0,255)的形式。然后将函数命名为getRGB(),并用以下代码进行测试。提示: 可以将字符串视为数组,这个数组的元素为字符。

function getRGB(color) {
let color1 = color.replace(/#/g, '');
console.log(color1)
let a = parseInt(color1.substring(0, 2), 16);
let b = parseInt(color1.substring(2, 4), 16);
let c = parseInt(color1.substring(4), 16);
return 'rgb(' + a + ',' + b + ',' + c + ')';
}
 

第四章答案

4. 在String()构造函数不存在的情况下自定义一个MyString()的构造器函数。记住,由于String()不存在,因此您在写构造器函数时不能使用任何属于内建String对象的方法和属性。并且要让您所创建的对象通过以下测试:

var s = new MyString("hello");
s.length; //5 s[0]; //"h" s.toString(); //"hello" s.valueOf(); //"hello" s.charAt(1); //"e" s.charAt("2"); //"l" s.charAt("e"); //"h" s.concat(" world!"); //"hello world!" s.slice(1,3); //"el" s.slice(0,-1); //"hell" s.split("e"); //["h","llo"] s.split("l"); //["he","","o"]

answer

function MyString(pstr){
this.str=pstr.toString();
this.length=this.str.length; for(var i=0;i<this.length;i++){
this[i]=this.str[i];
} this.toString=function (){
return this.str;
}; this.valueOf=function (){
return this.toString();
};
this.charAt=function(index){
index=parseInt(index,10);
index=isNaN(index)?0:index;
return this[index];
};
this.concat=function(concatStr){
return this.str+concatStr;
};
this.slice=function(startIndex,endIndex){
while(startIndex<0){
startIndex=startIndex+this.length;
}
while(endIndex<0){
endIndex=endIndex+this.length;
}
if(endIndex<=startIndex){
return "";
}
var resultStr="";
for(var i=startIndex;i<endIndex;i++){
resultStr+=this[i];
}
return resultStr;
};
this.split=function(s){
var resultArr=[];
var tempStr="";
for(var i=0;i<this.length;i++){
if(this[i]===s){
resultArr.push(tempStr);
tempStr="";
}else{
tempStr+=this[i];
}
}
resultArr.push(tempStr);
return resultArr;
};
this.reverse=function(){
var tempArr=[];
var i;
for(i=0;i<this.length;i++){
tempArr[i]=this[i];
}
tempArr.reverse();
this.str=tempArr.join("");
for(i=0;i<this.length;i++){
this[i]=tempArr[i];
}
};
}

6.在Array()构造器以及相关的数组文本标识法都不存在的情况下,自定义一个类似的MyArray()构造器,并令其通过以下测试:

var a = new MyArray(1,2,3,"test");
a.toString();
//"1,2,3,test" a.length;
//4 a[a.length-1];
//"test" a.push("boo");
//5 a.toString();
//"1,2,3,test,boo" a.pop();
//boo a.toString();
//"1,2,3,test" a.join(",");
//"1,2,3,test" a.join(" isn\'t");
//1 isn't 2 isn't 3 isn't test"

answer

function MyArray(){
this.length=arguments.length;
for(var i=0;i<this.length;i++){
this[i]=arguments[i];
} this.toString=function(){
var resultStr="";
for(var i=0;i<this.length;i++){
if(i===this.length-1){
resultStr+=this[i].toString();
}else{
resultStr+=this[i].toString()+",";
}
}
return resultStr;
};
this.push=function(obj){
this[this.length]=obj;
this.length++;
return this.length;
};
this.pop=function(){
if(this.length===0){
return null;
}
result=this[this.length-1];
this[this.length-1]=undefined;
this.length--;
return result;
};
this.join=function(str){
var resultStr="";
for(var i=0;i<this.length;i++){
if(i===this.length-1){
resultStr+=this[i].toString();
}else{
resultStr+=this[i].toString()+str;
}
}
return resultStr;
}
}

 

第七章

1.BOM

作为 BOM 的练习来说,我们可以试着写出许多错误的、富有骚扰性的、对用户非常 不友好的代码,以及所有非常 Web 1.0 的东西。例如晃动的浏览器窗口。请试着令浏览器 弹出一个 200 × 200 的窗口,然后将其大小渐变成 400 × 400,接着将窗口上下左右不停移 动,造成地震效果。为了实现这种效果,我们需要 move*()函数,其中需要一次或多次调用 setInterval(),最后可能还需要 setTimeout()及 clearInterval()来令其停止操作。 或者我们可以更简单一些,将当前日期时间通过 document.title 实时显示在浏览器的标题栏 中,并像钟表一样每秒钟更新一次。

var win = window.open('http://www.baidu.com', 'packt', 'width=200,height=200,resizable=yes');
setTimeout(() => win.resizeTo(400, 400), 1000);

2. DOM

2.1 换一种不同的方式来实现 walkDOM()方法,以回调函数参数的形式来代替console.log()硬编码。

    function walkDOM(n, callback) {
do {
callback(n);
if(n.hasChildNodes()) {
walkDOM(n.lastChild, callback);
}
} while (n = n.previousSibling);
} function callback(n) {
console.log(n)
} walkDOM(document.documentElement, callback);

2.2 创建一个叫做include()的函数,该函数可以按需将外部脚本引入当前页面。你可以首先动态创建一个新的<script>标签,然后设置其 src 属性,再将它插入到<head>标签末端。该函数应通过如下测试:

> include('somescript.js');

function include(src) {
var script = document.createElement('script');
script.src = src;
document.head.appendChild(script);
}
include('somescript.js');

3 事件

创建一个叫做myevent的跨浏览器事件工具集(或对象集),其中应该包含以下方法。

  1. addListener(element, event_name, callback) —其中的 element参数也可以是一个元素数组。
  2. removeListener(element, event_name, callback)。
  3. getEvent(event)—对于 IE 的早期版本,我们可以通过检查 window.event 属性来实现。
  4. getTarget(event)。
  5. stopPropagation(event)。
  6. preventDefault(event)。

其用例如下:

function myCallback(e) {
e = myevent.getEvent(e);
alert(myevent.getTarget(e).href);
myevent.stopPropagation(e);
myevent.preventDefault(e);
}
myevent.addListener(document.links, 'click', myCallback);

执行这段示例代码应该会使该文档中所有的链接失效,只不过,它们在被单击时会弹出一个 alert()窗口,以显示其 href 属性。 创建一个以像素定位的<div>元素,坐标为 x=100 px, y=100 px。然后编写代码使<div> 元素能按照以下按键 J(左)、 K(右)、 M(下)、 I(上)或对应方向键的操作方式在页面 中移动。并且,在编写过程中可以重用您刚刚实现的事件工具集。

let myevent = {
addListener(element, event_name, callback) {
if (element.length > 1) {
for (let item of element) {
addEvent(item, event_name, callback);
}
} else {
addEvent(element, event_name, callback);
} function addEvent(element, name, callback) {
if (element.addEventListener) {
element.addEventListener(event_name, callback, false);
} else if (element.attachEvent) {
element.attachEvent(event_name, callback, false);
} else {
element.event_name = callback;
}
}
},
removeListener(element, event_name, callback) {
if (element.removeEventListener) {
element.removeEventListener(event_name, callback, false);
} else if (element.detachEvent) {
element.detachEvent(event_name, callback, false);
}
},
getEvent(event) {
event = event || window.event;
return event;
},
getTarget(event) {
const target = event.target || event.srcElement;
return target;
},
stopPropagation(event) {
event.stopPropagation() || (event.cancelBubble = true);
},
preventDefault(event) {
event.preventDefault() || (event.returnValue = false);
}
} function myCallback(e) {
e = myevent.getEvent(e);
alert(myevent.getTarget(e).href);
myevent.stopPropagation(e);
myevent.preventDefault(e);
} myevent.addListener(document.links, 'click', myCallback);

4 XMLHttpRequest 对象

创建一个名为ajax的XHR工具集(或对象集),其示例用法如下:

function myCallback(xhr) {
alert(xhr.responseText);
}
ajax.request('somefile.txt', 'get', myCallback);
ajax.request('script.php', 'post', myCallback,
'first=John&last=Smith');

answer

let ajax = {
request(url, method, callbak, params) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = (function (myxhr) {
return function() {
if (myxhr.readyState === 4 && myxhr.status === 200) {
callbak(myxhr);
}
}
})(xhr);
xhr.open(method, url, true);
xhr.send(params || '');
}
} function myCallback(xhr) {
alert(xhr.responseText);
}
ajax.request('somefile.txt', 'get', myCallback);
ajax.request('script.php', 'post', myCallback, 'first=John&last=Smith');
 
 

javascript面向对象习题答案的更多相关文章

  1. JavaScript学习总结(三)——this、原型、javascript面向对象

    一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...

  2. JavaScript面向对象(三)——继承与闭包、JS实现继承的三种方式

      前  言 JRedu 在之前的两篇博客中,我们详细探讨了JavaScript OOP中的各种知识点(JS OOP基础与JS 中This指向详解 . 成员属性.静态属性.原型属性与JS原型链).今天 ...

  3. javascript(面向对象,作用域,闭包,设计模式等)

    javascript(面向对象,作用域,闭包,设计模式等) 1. 常用js类定义的方法有哪些? 参考答案:主要有构造函数原型和对象创建两种方法.原型法是通用老方法,对象创建是ES5推荐使用的方法.目前 ...

  4. JavaScript学习总结(四)——this、原型链、javascript面向对象

    一.this 在JavaScript中this表示:谁调用当前函数this就指向谁,不知道调用者时this指向window. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是 ...

  5. JavaScript 面向对象编程(三):非构造函数对象的继承

    JavaScript 面向对象编程(三):非构造函数对象的继承 一.什么是"非构造函数"的继承? 比如,现在有一个对象,叫做"中国人". var Chinese ...

  6. 深入理解 JavaScript 面向对象

    我们在学习编程时,避免不了会接触一个概念,叫:面向对象编程(Object-oriented programming,缩写:oop) (不是搞对象那个对象哈),其实我们的编程方式,不止有面向对象,还有 ...

  7. 全方位深入理解JavaScript面向对象

    JavaScript面向对象程序设计 转载:https://blog.csdn.net/lihangxiaoji/article/details/79753473#72__871 本文会碰到的知识点: ...

  8. JavaScript学习笔记(三)——this、原型、javascript面向对象

    一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...

  9. Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇

    Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...

随机推荐

  1. SignalR 中丰富多彩的消息推送方式

    在上一篇 SignalR 文章中,演示了如何通过 SignalR 实现了简单的聊天室功能:本着简洁就是美的原则,这一篇我们也来聊聊在 SignalR 中的用户和组的概念,理解这些基础知识有助于更好的开 ...

  2. 工厂方法模式(Factory Method Pattern)

    工厂方法模式概述 工厂方法模式是为了弥补简单工厂模式的不足并且继承它的优点而延生出的一种设计模式,属于GoF中的一种.它能更好的符合开闭原则的要求. 定义:定义了一个用于创建对象的接口,但是让子类决定 ...

  3. Rest_framework Router 路由器(含SimplyRouter源码浅解)

    目录 Rest_framework Router 路由器 ViewSet结合Router,自动生成url. 将ViewSet注册到Router中,需要三个要素: 关于路由规则,细分有四类: rest_ ...

  4. js 异步转同步

    在项目中有些逻辑或者请求依赖另一个异步请求,大家常用的方法是回调函数.现在有个高大上的解决方案:await async . async 是“异步”的简写,而 await 可以认为是 async wai ...

  5. Flutter的初体验--初次配置的问题

    首先参照官方文档进行搭建Mac下的环境 ,然后就会遇到以下问题:   1.在下载了Flutter 之后,执行Flutter doctor之后,报错: Could not resolve URL &qu ...

  6. AI应用开发实战 - 定制化视觉服务的使用

    AI应用开发实战 - 定制化视觉服务的使用 本篇教程的目标是学会使用定制化视觉服务,并能在UWP应用中集成定制化视觉服务模型. 前一篇:AI应用开发实战 - 手写识别应用入门 建议和反馈,请发送到 h ...

  7. 网络协议 18 - CDN:家门口的小卖铺

    [前五篇]系列文章传送门: 网络协议 13 - HTTPS 协议:加密路上无尽头 网络协议 14 - 流媒体协议:要说爱你不容易 网络协议 15 - P2P 协议:小种子大学问 网络协议 16 - D ...

  8. 10个小技巧助您写出高性能的ASP.NET Core代码

    今天这篇文章我们来聊一聊如何提升并优化ASP.NET Core应用程序的性能,本文的大部分内容来自翻译,当然中间穿插着自己的理解,希望对大家有所帮助!话不多说开始今天的主题吧! 我们都知道性能是公共网 ...

  9. 从零开始搭建运维体系 - ansible

    从零开始搭建运维体系 - ansible 基本配置好了局域网内的机器后,第一个遇到的问题就是如何批量操作这么多台机器,ansible就是这么一个自动化运维工具. ansible是一个基于ssh的批量远 ...

  10. Cache【硬盘缓存工具类(包含内存缓存LruCache和磁盘缓存DiskLruCache)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 内存缓存LruCache和磁盘缓存DiskLruCache的封装类,主要用于图片缓存. 效果图 代码分析 内存缓存LruCache和 ...