用js写了一个类似php的print_r输出换行功能

这里提供一个用JS实现类似PHP的print_r输出换行的完整攻略。

Html部分

首先要创建一个页面用于测试,可以直接编写HTML页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>print_r输出换行测试用例</title>
</head>
<body>
    <script type="text/javascript" src="index.js"></script>
</body>
</html>

JS部分

接下来我们需要创建一个包含print_r输出换行功能的JS文件,这里为了方便,直接命名为index.js

Step1

我们首先需要创建一个函数:

function print_r(obj, depth) {
    //TODO
}

这个函数用于接收需要输出的对象及输出的深度,其中输出的深度为可选参数,默认值为1,即输出一层。

Step2

接着在函数中判断当前的输出深度和当前对象的类型:

function print_r(obj, depth=1) {
    // 如果输出深度超出指定范围,直接返回
    if (depth <= 0) return;
    // 根据obj的类型分类进行处理
    switch(typeof(obj)){
        case 'undefined':
            console.log('undefined');
            break;

        case 'number':
        case 'string':
        case 'boolean':
            console.log(obj);
            break;

        case 'function':
            console.log(obj.toString().replace(/\{[\s\S]*/, '{\n    [native code]\n}'));
            break;

        case 'object':
            //TODO
            break;
    }   
}

当类型为undefined时,输出字符串'undefined';

当类型为number、string、boolean时,直接输出;

当类型为function时,使用正则表达式将函数转换成字符串输出,方便调试;

当类型为object时,需要进一步处理。

Step3

我们先定义一个用于填补不同深度的缩进字符串,可以写成如下的函数形式:

function repeatString(str, n) {
    var res = '';
    for (var i = 0; i < n; i++) {
        res += str;
    }
    return res;
}

这个函数接收一个字符串和重复次数作为参数,返回一个该字符串重复n次后的新字符串。

接下来,我们在switch中为类型为object的情况添加一个处理逻辑,代码如下:

function print_r(obj, depth=1) {
    // 如果输出深度超出指定范围,直接返回
    if (depth <= 0) return;
    // 根据obj的类型分类进行处理
    switch(typeof(obj)){
        case 'undefined':
            console.log('undefined');
            break;

        case 'number':
        case 'string':
        case 'boolean':
            console.log(obj);
            break;

        case 'function':
            console.log(obj.toString().replace(/\{[\s\S]*/, '{\n    [native code]\n}'));
            break;

        case 'object':
            var str = '';
            if (obj === null) {
                str += 'null\n';
                break;
            }
            str += 'Object {\n';
            var space = repeatString('    ', depth);
            for (var item in obj) {
                str += space + '[' + item + '] => ';
                str += print_r(obj[item], depth - 1);
            }
            str += space.slice(0, space.length - 4) + '}\n';
            console.log(str);
            break;
    }   
}

当obj为null时,输出字符串'null';

当obj为object时,输出'Object {'作为头部,在每一项前添加对应的缩进,最后输出尾部'}'。

这里在for循环中嵌套一次print_r函数,实现递归调用,输出对象的详细信息。

完整代码如下:

function print_r(obj, depth=1) {
    // 如果输出深度超出指定范围,直接返回
    if (depth <= 0) return;
    // 根据obj的类型分类进行处理
    switch(typeof(obj)){
        case 'undefined':
            console.log('undefined');
            break;

        case 'number':
        case 'string':
        case 'boolean':
            console.log(obj);
            break;

        case 'function':
            console.log(obj.toString().replace(/\{[\s\S]*/, '{\n    [native code]\n}'));
            break;

        case 'object':
            var str = '';
            if (obj === null) {
                str += 'null\n';
                break;
            }
            str += 'Object {\n';
            var space = repeatString('    ', depth);
            for (var item in obj) {
                str += space + '[' + item + '] => ';
                str += print_r(obj[item], depth - 1);
            }
            str += space.slice(0, space.length - 4) + '}\n';
            console.log(str);
            break;
    }   
}

function repeatString(str, n) {
    var res = '';
    for (var i = 0; i < n; i++) {
        res += str;
    }
    return res;
}

示例说明

我们来运行一个简单的测试来观察输出效果。

示例1

var a = 1;
print_r(a);

输出结果:

1

示例2

var arr = {
    name: 'Jack',
    age: 20,
    message: {
        flag: true,
        list: [1, 2, 3, 4],
        say: function() {
            console.log('hello world');
        }
    }
};
print_r(arr);

输出结果:

Object {
    [name] => Jack
    [age] => 20
    [message] => Object {
        [flag] => true
        [list] => Array [
            1
            2
            3
            4
        ]
        [say] => function say() {
    console.log('hello world');
}
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用js写了一个类似php的print_r输出换行功能 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • php设置页面超时时间解决方法

    下面是关于“PHP设置页面超时时间解决方法”的详细讲解: 1. 超时时间的概念 在前往解决方法之前,首先需要了解什么是“页面超时时间”。在web开发过程中,当我们发起一个请求时,php会在一定时间内(默认为 30 秒)等待服务器响应并返回结果,如果在这个时间内没有得到响应,就会返回“请求超时”的错误信息,这个等待时间就叫做“页面超时时间”。 2. 解决方法 …

    PHP 2023年5月23日
    00
  • 微信小程序 wx.request方法的异步封装实例详解

    下面是关于“微信小程序 wx.request方法的异步封装实例详解”的攻略: 前言 在进行微信小程序开发时,我们经常会用到wx.request()方法发起网络请求,但是该方法是异步的,这就需要我们充分掌握异步编程的知识。本文将结合两个示例详细讲解wx.request()方法的异步封装实例。 示例一 首先介绍一个简单的异步封装实例,来发起一个get请求: co…

    PHP 2023年5月23日
    00
  • PHP实现删除字符串中任何字符的函数

    要实现PHP删除字符串中任何字符的函数,我们可以使用PHP内置的str_replace函数,它可以用来替换字符串中的某些字符或子串,从而实现删除字符的功能。 下面是实现步骤: 1.编写函数头 function deleteChars($str, $charsToDelete) { 函数名为deleteChars,接收两个参数,分别为需要删除字符的字符串$st…

    PHP 2023年5月26日
    00
  • 在MySQL中修改密码及访问限制的设置方法详解

    当我们需要修改MySQL用户的密码或者限制其访问权限时,可以通过以下步骤来完成操作: 步骤一:登录MySQL 首先需要登录MySQL,在命令行环境下输入以下命令: mysql -u 用户名 -p 注意:上述命令中的“用户名”需要替换成你需要登录的用户名,登录后需要输入该用户的密码。 如果一切顺利,则会进入MySQL的命令行界面。 步骤二:查看用户列表 在My…

    PHP 2023年5月27日
    00
  • PHP include任意文件或URL介绍

    PHP中的include函数可以用于将一个文件中的内容插入到另一个文件中,这其中可以包含任意文件或URL。这种方式在开发web应用程序时非常常见,可以帮助我们重用代码,提高代码的可维护性。不过,如果使用不当,恶意用户可能会利用该功能从而执行任意代码,危及系统安全。因此,在使用此功能时,应该非常小心,严格限制可被包含的文件,并且不要直接将外部输入用作inclu…

    PHP 2023年5月26日
    00
  • php中关于换行的实例写法

    下面是关于PHP中换行的实例写法的攻略: 什么是换行? 在计算机领域中,换行是表示在一行末尾加上换行符,也就是回车符(\r)和换行符(\n)的字符组合,使得光标下移一行,可以显示下一行的内容。 如何在PHP中进行换行? 1. 使用HTML标签 在PHP中可以使用HTML中的换行标签<br>来实现换行。例如: echo "这是第一行。&l…

    PHP 2023年5月23日
    00
  • php 遍历数据表数据并列表横向排列的代码

    针对你的问题,我将提供一个完整的攻略。首先需要明确的是,PHP遍历数据表数据并横向排列的方法有很多种。下面提供两种常见做法。 方法一 这是一种比较基础的方法,主要是通过使用MySQLi库中的查询结果集函数,将所需数据存放在一个二维数组中,并使用for循环逐项输出。 Step 1:连接数据库 首先需要连接到数据库,可以使用以下代码: $conn = mysql…

    PHP 2023年5月26日
    00
  • 浅谈PHP设计模式的适配器模式

    简介: 适配器模式属于结构型设计模式。将一个类的接口转换成可应用的兼容接口。适配器使原本由于接口不兼容而不能一起工作的那些类可以一起工作。适配器模式有两种实现方案,一种是继承的方式,一种是组合的方式。 适用场景: 兼容不方便更改的“祖传”代码。 归纳具有相似点的模块,比如Laravel FileSystemAdapter。 优点: 扩展了原有类,增强了扩展性…

    PHP 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部