js练习
/**
* Created by bianxiaoling on 2018/9/7.
*/
//
// 获取 url 中的参数
// 1. 指定参数名称,返回该参数的值 或者 空字符串
// 2. 不指定参数名称,返回全部的参数对象 或者 {}
// 3. 如果存在多个同名参数,则返回数组
// 示例1
// 输入
// http://www.nowcoder.com?key=1&key=2&key=3 test=4#hehe
// 输出
// [1, 2, 3]
function getUrlParam(sUrl, sKey) {
//#号后面的不截取通不过split("#")
var oKey = sUrl.split("?")[1].split("#")[0].split("&");
var rObj = {}; for(var i = 0;i<oKey.length;i++){
var keyVal = oKey[i].split("=");
if(!rObj[keyVal[0]] && rObj[keyVal[0]] !==""){
if(keyVal.length == 1 && oKey[i].indexOf("=") >0){
rObj[keyVal[0]] = "";
}
else if(keyVal.length == 1 && oKey[i].indexOf("=") <0){
rObj[keyVal[0]] = undefined;
}
else{
rObj[keyVal[0]] = keyVal[1];
}
}
else {
if(rObj[keyVal[0]] instanceof Array){
rObj[keyVal[0]].push(keyVal[1]);
}
else{
rObj[keyVal[0]] = [rObj[keyVal[0]]];
rObj[keyVal[0]].push(keyVal[1]);
}
}
}
if(!sKey){
return rObj;
}
else{
return rObj[sKey]?rObj[sKey]:"";
}
} console.log(getUrlParam("http://www.nowcoder.com?key=1&key=2&key=3&test=4#hehe"));//{key:["1","2","3"],test:"4"} //
// 查找两个节点的最近的一个共同父节点,可以包括节点自身
// 输入描述:
// oNode1 和 oNode2 在同一文档中,且不会为相同的节点
function commonParentNode(oNode1, oNode2) {
if(oNode1.contains(oNode2)){
return oNode1;
}else{
return commonParentNode(oNode1.parentNode,oNode2);
}
} //
// 根据包名,在指定空间中创建对象
// 输入描述:
// namespace({a: {test: 1, b: 2}}, 'a.b.c.d')
// 输出描述:
// {a: {test: 1, b: {c: {d: {}}}}}
function namespace(oNamespace, sPackage) {
var arr = sPackage.split('.');
var res = oNamespace; // 保留对原始对象的引用
for(var i = 0, len = arr.length; i < len; i++) {
if(arr[i] in oNamespace) { // 空间名在对象中
if(typeof oNamespace[arr[i]] !== "object") { // 为原始值
oNamespace[arr[i]] = {}; // 将此属性设为空对象
}
} else { // 空间名不在对象中,建立此空间名属性,赋值为空
oNamespace[arr[i]] = {};
}
oNamespace = oNamespace[arr[i]]; // 将指针指向下一个空间名属性。
}
return res;
}
console.log(namespace({a: {test: 1, b: 2}}, 'a.b.c.d')); //
// 为 Array 对象添加一个去除重复项的方法
// 示例1
// 输入
// [false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN]
// 输出
// [false, true, undefined, null, NaN, 0, 1, {}, {}, 'a']
Array.prototype.uniq = function () {
var rem = [],
flag = true;//NaN=存在的标志
for(var i=0;i<this.length;i++){
if(rem.indexOf(this[i]) == -1){
if(this[i] != this[i]){//NaN
if(flag){
rem.push(this[i]);
flag = false;
}
}
else{
rem.push(this[i]);
}
}
}
return rem;
}
console.log([false,false, true, undefined, undefined,null, null,NaN, 0, 1, {}, {}, 'a', 'a', "b","b",NaN]);
console.log([false,false, true, undefined, undefined,null, null,NaN, 0, 1, {}, {}, 'a', 'a', "b","b",NaN].uniq()); //
// 按所给的时间格式输出指定的时间
//
// 格式说明
// 对于 2014.09.05 13:14:20
// yyyy: 年份,2014
// yy: 年份,14
// MM: 月份,补满两位,09
// M: 月份, 9
// dd: 日期,补满两位,05
// d: 日期, 5
// HH: 24制小时,补满两位,13
// H: 24制小时,13
// hh: 12制小时,补满两位,01
// h: 12制小时,1
// mm: 分钟,补满两位,14
// m: 分钟,14
// ss: 秒,补满两位,20
// s: 秒,20
// w: 星期,为 ['日', '一', '二', '三', '四', '五', '六'] 中的某一个,本 demo 结果为 五
//
// 示例1
// 输入
// formatDate(new Date(1409894060000), 'yyyy-MM-dd HH:mm:ss 星期w')
// 输出
// 2014-09-05 13:14:20 星期五 //
// 如果第二个参数 bUnicode255For1 === true,则所有字符长度为 1
// 否则如果字符 Unicode 编码 > 255 则长度为 2
//
// 示例1
// 输入
// 'hello world, 牛客', false
// 输出
//
function strLength(s, bUnicode255For1) {
var len = s.length;
if(bUnicode255For1)
return len;
else{
for(var i=0; i<s.length;i++){
if(s.charCodeAt(i)>255){
len++;
}
}
return len;
}
} console.log(strLength('hello world, 牛客', false)); //8.
// 判断输入是否是正确的邮箱格式
// 输入描述:
// 邮箱字符串
// 输出描述:
// true表示格式正确
function isAvailableEmail(sEmail) {
var reg = /^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/;
return reg.test(sEmail);
} console.log(isAvailableEmail("419209374@qq.com")); //
// 将 rgb 颜色字符串转换为十六进制的形式,如 rgb(255, 255, 255) 转为 #ffffff
// 1. rgb 中每个 , 后面的空格数量不固定
// 2. 十六进制表达式使用六位小写字母
// 3. 如果输入不符合 rgb 格式,返回原始输入
//
// 示例1
// 输入
// 'rgb(255, 255, 255)'
// 输出
// #ffffff
function rgb2hex(sRGB) { } //
// css 中经常有类似 background-image 这种通过 - 连接的字符,通过 javascript 设置样式的时候需要将这种样式转换成 backgroundImage 驼峰格式,请完成此转换功能
// 1. 以 - 为分隔符,将第二个起的非空单词首字母转为大写
// 2. -webkit-border-image 转换后的结果为 webkitBorderImage
//
// 示例1
// 输入
// 'font-size'
// 输出
// fontSize
function cssStyle2DomStyle(sName) {
//判断字符串sName[0]是否为"-"
if(sName.indexOf("-") == 0){
sName = sName.substring(1);
}
var rem = sName.split("-"),newRem = [];
for(var i=1;i<rem.length;i++){
newRem.push(rem[i].slice(0,1).toUpperCase() +rem[i].slice(1));
}
newRem.unshift(rem[0]);
return newRem.join("");
} console.log(cssStyle2DomStyle('font-size-ddd-sdd')); //
// 统计字符串中每个字符的出现频率,返回一个 Object,key 为统计字符,value 为出现频率
// 1. 不限制 key 的顺序
// 2. 输入的字符串参数不会为空
// 3. 忽略空白字符
//
// 示例1
// 输入
// 'hello world'
// 输出
// {h: 1, e: 1, l: 3, o: 2, w: 1, r: 1, d: 1}
function count(str) {
var rObj = {};
for(var i=0;i<str.length;i++){
if(str[i] in rObj){
rObj[str[i]]++;
}
else{
rObj[str[i]] = 1;
}
}
return rObj;
} console.log(count('hello world'));
js练习的更多相关文章
- Vue.js 和 MVVM 小细节
MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...
- js学习笔记:操作iframe
iframe可以说是比较老得话题了,而且网上也基本上在说少用iframe,其原因大致为:堵塞页面加载.安全问题.兼容性问题.搜索引擎抓取不到等等,不过相对于这些缺点,iframe的优点更牛,跨域请求. ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- JS调用Android、Ios原生控件
在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...
- jquery和Js的区别和基础操作
jqery的语法和js的语法一样,算是把js升级了一下,这两种语法可以一起使用,只不过是用jqery更加方便 一个页面想要使用jqery的话,先要引入一下jqery包,jqery包从网上下一个就可以, ...
- 利用snowfall.jquery.js实现爱心满屏飞
小颖在上一篇一步一步教你用CSS画爱心中已经分享一种画爱心的方法,这次再分享一种方法用css画爱心,并利用snowfall.jquery.js实现爱心满屏飞的效果. 第一步: 利用伪元素before和 ...
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...
- JS正则表达式常用总结
正则表达式的创建 JS正则表达式的创建有两种方式: new RegExp() 和 直接字面量. //使用RegExp对象创建 var regObj = new RegExp("(^\\s+) ...
- 干货分享:让你分分钟学会 JS 闭包
闭包,是 Javascript 比较重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,很难从定义去理解它.因此,本文不会对闭包的概念进行大篇幅描述 ...
- JS核心系列:理解 new 的运行机制
和其他高级语言一样 javascript 中也有 new 运算符,我们知道 new 运算符是用来实例化一个类,从而在内存中分配一个实例对象. 但在 javascript 中,万物皆对象,为什么还要通过 ...
随机推荐
- egret中场景跳转的动画
原理:创建一个截取当前场景的截图然后对截图进行bitmap处理加上tween.优点:无需任何图片,特效!适用于任何场景! //1.卷帘特效 //2.左右切换移动 //3.直接翻 //4.旋转掉落 // ...
- ubuntu系统 不能访问非系统磁盘即挂载的数据盘 Unable to access "DATA"
问题描述: ubuntu14.04 有两个硬盘,一个固态硬盘作为系统盘,一个机械硬盘作为数据盘. 打开 数据盘“DATA”时出现下面的错误: Unable to access "DATA&q ...
- 【Appium】Appium工作原理(2)
Appium原理 面试的时候,被问到appium原理,一点不会,实在尴尬. 大家可以直接翻看原作https://blog.csdn.net/jffhy2017/article/details/6922 ...
- Mac下部署Ionic环境
1.下载安装nodejs,可以到官网http://nodejs.org/en/download/上去下载最新版本安装,比较无脑.如果官网打不开的话可以到中文网站去下载http://nodejs.cn/ ...
- 深度解析synchronized的实现原理(并发一)
一.synchronized实现原理 1.synchronized实现同步的基础: 1).普通同步方法:锁是当前实例对象 2).静态同步方法:锁是当前类的class对象 3).同步方法块:锁是括号里面 ...
- Exploit-Exercises nebule 旅行日志(六)
接着上次的路程继续在ubuntu下对漏洞的探索练习,这次是level05了 先看下level05的问题描述: 从level05的描述上看,是/home/flag05目录的权限有漏洞,看来多半是又跟fl ...
- 记一次msyql导入导致的问题
公司有个项目要导入150M大小的sql文件,但是导入时报错,去网上找答案,很多人说是因为保留字什么什么的,所以就按照sql文件里面的mysql版本又去下载了一份mysql5.6安装好,但是登陆不了,又 ...
- Adversarial Examples for Semantic Segmentation and Object Detection 阅读笔记
Adversarial Examples for Semantic Segmentation and Object Detection (语义分割和目标检测中的对抗样本) 作者:Cihang Xie, ...
- java基础知识—类和对象
1.对象的特征---类的属性 每个对象的每个属性都有特定的值 对象的操作---类的方法 2.封装 对象同时具有属性和方法两项属性. 对象的属性和方法同时被封装在一起,共同体现事物的特性,二者相辅相成, ...
- 使用datepicker和uploadify的冲突解决(IE双击才能打开附件上传对话框)
在开发的过程当中,IE的兼容无疑是我们的一块绊脚石,在我们使用的如期的datepicker插件和使用上传附件的uploadify插件的时候,两者就产生冲突,只要点击过时间的插件,uploadify上传 ...